我正在使用SQL Server 2008。
我有一个表A,它在一秒钟内接受许多插入/更新。插入后,更新我想获得受影响的行数。
INSERT INTO A (ID) VALUES (1)
IF @@ROWCOUNT = 0
PRINT 'NO ROWS AFFECTED'
在执行查询时,应用程序可能会再次调用相同的查询。那么如果当前执行在INSERT之后但在此时阻止IF阻塞之前会发生什么呢?
您是否认为@@ROWCOUNT
可能因此而给出错误的结果?
或者它在上下文中总是安全吗?
答案 0 :(得分:21)
是的 - 它的安全。它始终引用当前查询中的上一个操作
但是
如果您想知道受影响的行数,先将其保存到变量,因为在IF
语句后,计数@@ROWCOUNT
会重置
INSERT INTO A (ID) VALUES (1)
DECLARE @rc INT = @@ROWCOUNT
IF @rc = 0
PRINT 'NO ROWS AFFECTED'
ELSE
SELECT @rc AS RowsAffected
答案 1 :(得分:7)
@@ ROWCOUNT既是范围又是连接安全。
实际上,它只读取该连接和范围的最后一个语句行数。完整规则是here on MSDN(游标,DML,EXECUTE等)
要在后续语句中使用它,您需要将其存储在本地变量中。
答案 2 :(得分:1)
必须 保留局部变量中的@@ROWCOUNT
值,否则在IF
语句后其值将重置为零:
SET @rowCount = @@ROWCOUNT
IF @rowCount = 0
PRINT 'NO ROWS AFFECTED'
除此之外,是的,这是安全的。
答案 3 :(得分:0)
简短回答:是的。
然而,值得从一个角度来看待这个问题,以便更深入地理解为什么答案是如此自然无疑。
SQL Server准备按其性质正确处理并发访问,无论客户端应用程序是否为多线程。除非此属性SQL Server在任何多用户方案中无用。从服务器的角度来看,一个多线程应用程序或两个当前正由多个用户同时使用服务器的应用程序引起的并发访问并不重要。
关于这一点,@@ rowcount只是冰山的顶端,当图片中的并发访问时,必须正确处理的功能要多得多。
该领域最实用的部分是事务管理和事务隔离。