Does @@ROWCOUNT
可靠地告诉你有多少行matched the WHERE
条款中的UPDATE
,而不是实际有多少changed by it?
In 的文档@@ROWCOUNT http://msdn.microsoft.com/en-gb/library/ms187316.aspx它说:
数据操作语言 (DML) 语句设置@@ROWCOUNT
值到行数affected通过查询并将该值返回给客户端。
(我的强调。)
但如果我有
CREATE TABLE [Foo] ([a] INT, [b] INT)
GO
INSERT INTO [Foo] ([a], [b]) VALUES (1, 1),(1, 2),(1, 3),(2, 2)
GO
UPDATE [Foo] SET [b] = 1 WHERE [a] = 1
SELECT @@ROWCOUNT
GO
...我懂了3
(匹配的行数[a] = 1
), not 2
(修改的行数UPDATE
— 三行之一已经具有该值1
for b
)。这似乎是“受影响”的一个奇怪的定义(不是wrong,与我通常使用这个词的方式不一致——事实上,它对于我想做的事情来说非常方便)。
(类似MySQLROW_COUNT http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_row-count例如,函数将返回2
在这个情况下。)
这种行为是否可靠,是否理想地记录在我尚未找到的地方?或者是否存在奇怪的边缘情况......
需要明确的是:我不是问是否3
is the right回答。我问的是不是reliable答案,或者是否存在 SQL Server 会遗漏匹配但不需要更改的行的边缘情况。
Update:有几个人问(或暗示)我担心什么样的“可靠性”问题。事实上它们非常模糊,但是,我不知道,复制?交易?分区?它可以使用索引来避免查找行,因为它知道b
已经1
,所以它会跳过那些? ...?
Update:我希望有人对 SQL Server 如何工作有更“内部”的看法来回答这个问题,但它看起来像触发器示例(以及我玩过的其他示例)通过 xacinay https://stackoverflow.com/a/23954719/157247已经是我们所能达到的最接近的了。而且它看起来非常坚固;如果它在正常情况下表现得如此,并且尽管进行了分区或其他什么,但它并没有那样表现,正如有人所说,那肯定会成为一个错误。这只是经验性的而非学术性的。