SQL Server - 在多线程应用程序中使用@@ ROWCOUNT安全吗?

Ahm*_*tun 13 sql sql-server insert

我正在使用SQL Server 2008.

我有一个表A,它在一秒钟内接受许多插入/更新.插入后,更新我想获得受影响的行数.

INSERT INTO A (ID) VALUES (1)
IF @@ROWCOUNT = 0
    PRINT 'NO ROWS AFFECTED'
Run Code Online (Sandbox Code Playgroud)

在执行查询时,应用程序可能再次调用相同的查询.那么如果当前执行在INSERT之后但在此时IF阻塞之前会发生什么.

您是否认为@@ROWCOUNT可能因此而给出错误的结果?

或者它在上下文中总是安全的吗?

Ole*_*Dok 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
Run Code Online (Sandbox Code Playgroud)


gbn*_*gbn 7

@@ ROWCOUNT是范围和连接安全的.

实际上,它只读取该连接和范围的最后一个语句行数.MSDN上有完整的规则(游标,DML,EXECUTE等)

要在后续语句中使用它,您需要将其存储在局部变量中.