Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 设置影响嵌入标量函数的行数_Sql_Sql Server - Fatal编程技术网

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

Sql 设置影响嵌入标量函数的行数,sql,sql-server,Sql,Sql Server,我有一个SQL查询,其中嵌入了标量值函数。该函数从表中的不同行中选择名称,并使用逗号作为分隔符将它们连接起来。例如ABC、DEF、XYZ。我已将查询的ROWCOUNT设置为仅1,因为我只需要1条记录。问题是,如果我将ROWCOUNT设置为1,我的标量函数将产生意外的结果,即ABC而不是ABC、DEF、XYZ 有人能帮忙吗?我仅限于使用ROWCOUNT而不是TOP子句。设置ROWCOUNT将影响外部SELECT语句返回的行以及标量UDF中包含的任何SELECT语句的外部级别 因此,除非您可以更改标

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


有人能帮忙吗?我仅限于使用ROWCOUNT而不是TOP子句。

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

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

我假设您使用的是变量赋值方法。如果更改为
XML路径
方法,则作为最顶端的
选择
仅返回1行,它将不受
设置行数1
命令的影响

示例代码 结果
你能解释一下为什么要使用ROWCOUNT而不是TOP子句吗@@ROWCOUNT()是一个函数,用于返回结果集中的行数。不能使用ROWCOUNT仅选择前n行。此外,集合没有顺序,SQL是基于集合的。。。如果没有明确的顺序,则无法保证结果值。您还需要确保ORDER BY是确定性的,因此需要WITH TIES子句或TIEBRAKER。这就是为什么
SET ROWCOUNT
被弃用并替换为TOP子句的原因:更改它会产生全局的、意外的副作用。@twoleggedhorse-您谈论的是函数,而不是语句。
    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 |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+