我有一个 SQL 查询,其中嵌入了一个标量值函数。该函数从表中的各个行中选择名称,并用逗号作为分隔符将它们连接起来。例如 ABC、DEF、XYZ。我已将查询的 ROWCOUNT 设置为 1,因为我只需要 1 条记录。问题是,如果我将 ROWCOUNT 设置为 1,我的标量函数会产生意想不到的结果,即 ABC 而不是 ABC、DEF、XYZ。
有人可以帮忙吗?我只能使用 ROWCOUNT 而不是 TOP 子句。
我有一个 SQL 查询,其中嵌入了一个标量值函数。该函数从表中的各个行中选择名称,并用逗号作为分隔符将它们连接起来。例如 ABC、DEF、XYZ。我已将查询的 ROWCOUNT 设置为 1,因为我只需要 1 条记录。问题是,如果我将 ROWCOUNT 设置为 1,我的标量函数会产生意想不到的结果,即 ABC 而不是 ABC、DEF、XYZ。
有人可以帮忙吗?我只能使用 ROWCOUNT 而不是 TOP 子句。
SET ROWCOUNT
将影响外部语句返回的行以及标量 UDF 中包含SELECT
的任何语句的外部级别。SELECT
SET ROWCOUNT
因此,除非您可以更改标量 UDF 的定义,否则单独使用是不可能的。
我假设您正在使用未记录且无法保证的变量分配方法。如果您更改为该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 |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+