Sql server 当没有更改数据表行时,不计数输出1行或多行的触发器受到影响
我正在使用SQL Server 2012。我在视图上有触发器,目的是允许我的用户像在其他表上一样在视图上执行DML操作。这些触发器有Sql server 当没有更改数据表行时,不计数输出1行或多行的触发器受到影响,sql-server,tsql,database-trigger,nocount,Sql Server,Tsql,Database Trigger,Nocount,我正在使用SQL Server 2012。我在视图上有触发器,目的是允许我的用户像在其他表上一样在视图上执行DML操作。这些触发器有设置NOCOUNT ON和许多IF…RAISERROR(…)RETURN语句来捕获逻辑错误。我注意到,即使在不影响任何基础表的情况下返回触发器,SSMS也会输出“n个或多个受影响的行”,其中n是视图中受影响的行数。因此,我测试了以下简单触发器,结果相同: CREATE TRIGGER dbo.triggerViewTest ON dbo.viewTest INST
设置NOCOUNT ON
和许多IF…RAISERROR(…)RETURN
语句来捕获逻辑错误。我注意到,即使在不影响任何基础表的情况下返回触发器,SSMS也会输出“n个或多个受影响的行”,其中n是视图中受影响的行数。因此,我测试了以下简单触发器,结果相同:
CREATE TRIGGER dbo.triggerViewTest
ON dbo.viewTest
INSTEAD OF INSERT AS
BEGIN
SET NOCOUNT ON
IF 1 != 0
BEGIN
RAISERROR('No rows should be affected!', 16, 1)
RETURN
END
END
INSERT INTO dbo.viewTest (columnA) VALUES (1)
和SSMS打印受影响的1行
如何抑制此输出?以下内容将阻止此消息返回控制台。 它与会话设置有关,而与触发器代码无关
set nocount on
insert into viewTest select...
set nocount off
根据@Eralper所说的回答我自己的问题;此消息来自会话设置,而不是触发器。因此,防止该消息的唯一方法是抛出一个错误,该错误将取消该会话(
RAISERROR()
不会取消该会话)。以下触发器不显示受影响的n行
:
CREATE TRIGGER dbo.triggerViewTest
ON dbo.viewTest
INSTEAD OF INSERT AS
BEGIN
SET NOCOUNT ON
IF 1 != 0
BEGIN
;THROW 50000, 'No rows should be affected!', 1
END
END
INSERT INTO dbo.viewTest (columnA) VALUES (1)
这是insert中的行数,而不是触发器执行的任何操作的行数。我将此标记为答案,因为
它与会话设置相关…
是此行为的原因,而防止此消息的唯一方法是抛出一个错误。