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吗?
某些语句可能会更改触发器内的@@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)
| 归档时间: |
|
| 查看次数: |
4265 次 |
| 最近记录: |