设置影响嵌入式标量函数的行数

Posted

技术标签:

【中文标题】设置影响嵌入式标量函数的行数【英文标题】:Set Rowcount affecting embedded scalar function 【发布时间】:2013-05-25 16:06:49 【问题描述】:

我有一个嵌入了标量值函数的 SQL 查询。该函数从表中的各个行中选择名称,并用逗号作为分隔符将它们连接起来。例如ABC、DEF、XYZ。我已将查询的 ROWCOUNT 设置为 1,因为我只需要 1 条记录。问题是,如果我将 ROWCOUNT 设置为 1,我的标量函数会产生意想不到的结果,即 ABC 而不是 ABC、DEF、XYZ。

有人可以帮忙吗?我只能使用 ROWCOUNT 而不是 TOP 子句。

【问题讨论】:

您能解释一下为什么要使用 ROWCOUNT 而不是 TOP 子句吗? Aaron 的进一步评论。@@ROWCOUNT() 是一个用于返回结果集中行数的函数。您不能使用 ROWCOUNT 仅选择前 n 行。 此外,集合没有顺序,并且 SQL 是基于集合的...如果没有明确的 ORDER BY,则无法保证您的结果值。您还需要确保 ORDER BY 是确定性的,因此您需要 WITH TIES 子句或决胜局。 这就是为什么 SET ROWCOUNT 被弃用并被 TOP 子句取代的原因:更改它会产生全局的、意想不到的副作用。 @twoleggedhorse - 你说的是@@ROWCOUNT 函数而不是SET ROWCOUNT 语句。 【参考方案1】:

SET ROWCOUNT 将影响外部 SELECT 语句返回的行以及标量 UDF 中包含的任何 SELECT 语句的外部级别。

因此,除非您可以更改标量 UDF 的定义,否则单独使用 SET ROWCOUNT 是不可能的。

我假设您使用的是undocumented and un guaranteed 变量赋值方法。如果您更改为 XML PATH 方法,那么最顶部的 SELECT 只会返回 1 行,它不会受到 SET ROWCOUNT 1 命令的影响。

示例代码

    USE tempdb;
GO
    CREATE FUNCTION dbo.Concat1(@number INT = 0)
    RETURNS NVARCHAR(max)
    AS
      BEGIN
          DECLARE @Result NVARCHAR(max)

          SELECT @Result = COALESCE(@Result + ',','') + name
          FROM   master..spt_values
          WHERE  number = @number

          RETURN @Result
      END
GO
    CREATE FUNCTION dbo.Concat2(@number INT = 0)
    RETURNS NVARCHAR(max)
    AS
      BEGIN
          RETURN
            (SELECT STUFF((SELECT ',' + name AS [text()]
                           FROM   master..spt_values
                           WHERE  number = @number
                           FOR XML PATH('')), 1, 1, ''))
      END
GO
    SET ROWCOUNT 1;

    SELECT dbo.Concat1(number) AS Concat1,
           dbo.Concat2(number) AS Concat2
    FROM   master..spt_values
    WHERE  number = 1

    DROP FUNCTION dbo.Concat1, dbo.Concat2 

结果

+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Concat1 |                                                                              Concat2                                                                               |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| rpc     | rpc,yes,autoclose,published,WINDOWS/NT,trusted,ignore duplicate keys,binary,varbinary,primary,NULL,Xact,NUL,GRANT,system table,disable_def_cnst_check,default disk |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+

【讨论】:

以上是关于设置影响嵌入式标量函数的行数的主要内容,如果未能解决你的问题,请参考以下文章

受 BigQuery 查询影响的行数

如何取得前一次MySql操作所影响的行数

返回受 UPDATE 语句影响的行数

2017年7月27~~~

如何获取受 SQL Alchemy 影响的行数?

根据表中的行数调整 NSTableView 或 NSScrollView 的大小