Set NoCount On导致触发器@@RowCount为0

今天无意中发现SQL Server一个疑似Bug的特性,特此记录。
由于对表的DML操作无论有无数据被影响,Trigger都会被执行,所以为提升性能,微软建议在Trigger中增加 IF @@RowCOUNT = 0 Return 这样的语句。
另外,在SQL的联机丛书中,对Set On CountOn有一个说明:The @@ROWCOUNT function is updated even when SET NOCOUNT is ON(即使SET NOCOUNT ON,@@ROWCOUNT也会被更新)
但发现事实却不是这样,在触发器中,Set NoCount On会将@@RowCount清零。
测试过程如下:

  • 触发器之外,SET NOCOUNT ON 对 @@ROWCOUNT 无影响
DECLARE @Table TABLE(col1 INT)
INSERT INTO @Table(col1) VALUES (2932),(142)

SET NOCOUNT ON
SELECT * FROM @table
SELECT @@ROWCOUNT

  • 触发器之内,@@ROWCOUNT 被 SET NOCOUNT ON 清零
-- 测试表和数据
CREATE TABLE TestTable(col INT)
CREATE TABLE RowCNT(col INT)
INSERT TestTable VALUES(1)

-- 测试触发器,将@@RowCount记在表中
CREATE TRIGGER TestTable_Upt 
ON TestTable AFTER UPDATE
AS
BEGIN
	SET NOCOUNT ON;
	INSERT RowCNT VALUES(@@ROWCOUNT);
END

-- 触发触发器
UPDATE TestTable SET col = 2

-- 查看@@ROWCOUNT
SELECT * FROM RowCNT

结果如下:

若将上述触发器中的Set NoCount On去掉,再次运行Update语句后,发现@@ROWCOUNT恢复正常。