gpt4 book ai didi

sql - 为什么@@ ROWCOUNT使用sp_executesql为NULL语句返回1?

转载 作者:行者123 更新时间:2023-12-04 13:30:04 24 4
gpt4 key购买 nike

如果我运行此命令:

DECLARE @sql NVARCHAR(10) = NULL;
EXEC sp_executesql @sql;
SELECT @@ROWCOUNT;

我希望得到0,甚至NULL也会有意义。但是我什么也没有,我得到1。为什么执行NULL查询会影响1行?如果我传递“适当的”(non_NULL)查询,那么它将正常工作。

背景(针对那些关心的人):这是来自应该生成一些动态SQL以更新一行并且仅更新一行的过程。我需要检查1行是否受到影响,而不是0或2或大于2。它工作正常,直到设法以某种方式设法生成NULL SQL语句,并且这被视为成功-糟糕!

实际的解决方法是在运行SQL之前检查SQL是否为非NULL,并以与1以外的结果相同的方式对待NULL语句。但是我仍然很好奇为什么它表现为这种方式。

最佳答案

这是因为您将NULL分配给了变量。进行简单赋值的语句始终将@@ROWCOUNT值设置为1。

请参见下面的示例。由于Management Studio可以在连接上运行自己的查询并弄乱@@ROWCOUNT值,因此它开始选择一个空结果集以确保初始@@ROWCOUNT值为零。

没有分配时,SELECT @@ROWCOUNT返回0(初始值尚未修改)。否则返回1

/*Ensure @@ROWCOUNT starts off at 0*/
SELECT 1 WHERE 1 = 0;

DECLARE @sql NVARCHAR(10);
EXEC sp_executesql @sql;
SELECT @@ROWCOUNT;

GO

/*Ensure @@ROWCOUNT starts off at 0*/
SELECT 1 WHERE 1 = 0;

DECLARE @sql NVARCHAR(10) = NULL;
EXEC sp_executesql @sql;
SELECT @@ROWCOUNT;

您还可以尝试使用非零初始值进行类似操作:
/*Ensure @@ROWCOUNT starts off at 3*/
SELECT 1 UNION SELECT 2 UNION SELECT 3

DECLARE @sql NVARCHAR(10);
EXEC sp_executesql @sql;
SELECT @@ROWCOUNT; --Returns 3

GO

/*Ensure @@ROWCOUNT starts off at 3*/
SELECT 1 UNION SELECT 2 UNION SELECT 3

DECLARE @sql NVARCHAR(10) = NULL;
EXEC sp_executesql @sql;
SELECT @@ROWCOUNT; --Returns 1

关于sql - 为什么@@ ROWCOUNT使用sp_executesql为NULL语句返回1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56838435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com