从INSTEAD OF TRIGGER获得ROWCOUNT

Lar*_*mie 6 sql sql-server triggers sql-server-2008

遗留应用程序使用而不是触发器对表执行INSERT,然后使用行计数进行进一步处理.

我们现在需要使用INSTEAD OF INSERT触发器选择退出某些INSERT .

问题是@@ ROWCOUNT仍然返回尝试插入的次数.

例如,永远不会完成插入的虚构触发器可能是

ALTER TRIGGER [dbo].[trig_ACCOUNT_CREDITS_RunningTotalINSERT]
   ON  [dbo].[ACCOUNT_CREDITS] 
   INSTEAD OF INSERT
AS 
BEGIN
 --tried with NOCOUNT ON and OFF
 SET NOCOUNT OFF;

 --This is an example of the branching logic that might determine 
 --whether or not to do the INSERT
IF 1=2 --no insert will ever occur (example only)
BEGIN
    INSERT INTO dbo.ACCOUNT_CREDITS (COL1, COL2)
    SELECT COL1, COL2 from INSERTED
END
END
Run Code Online (Sandbox Code Playgroud)

和一些INSERT语句可能是

--No rows will be inserted because value of COL1 < 5
INSERT INTO dbo.ACCOUNT_CREDITS (COL1, COL2) VALUES ( 3, 3)

--We would assume row count to be 0, but returns 1
select @@ROWCOUNT

--No rows will be inserted because value of COL1 < 5       
INSERT INTO dbo.ACCOUNT_CREDITS (COL1, COL2) 
SELECT 1, 1
union all
SELECT 2, 2

--We would assume row count to be 0, but returns 2
select @@ROWCOUNT
Run Code Online (Sandbox Code Playgroud)

我可以解决这个问题,但是我不能相信@@ ROWCOUNT.我在SO或其他知识库上找不到这个问题的参考.这只是TRIGGERS的案例吗?

我可以影响@@ ROWCOUNT吗?

Lex*_*Lex 3

某些语句可能会更改触发器内的@@ROWCOUNT。

陈述

SELECT * FROM INSERTED WHERE COL1 < 5
Run Code Online (Sandbox Code Playgroud)

执行并将@@ROWCOUNT设置为1

Put语句

SET NOCOUNT ON;
Run Code Online (Sandbox Code Playgroud)

然后

IF NOT EXISTS (SELECT * FROM INSERTED WHERE COL1 < 5)
BEGIN
    SET NOCOUNT OFF;

    INSERT INTO dbo.ACCOUNT_CREDITS (COL1, COL2)
    SELECT COL1, COL2 from INSERTED
END
Run Code Online (Sandbox Code Playgroud)