0

我正在使用 SQL Server 2012。我在视图上有触发器,目的是允许我的用户像任何其他表一样对其执行 DML 操作。这些触发器有SET 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 row(s) affected

如何抑制此输出?

4

2 回答 2

1

以下将阻止此消息返回到控制台。它与会话设置有关,与触发代码无关

set nocount on
insert into viewTest select...
set nocount off
于 2017-12-28T06:17:32.380 回答
0

根据@Eralper 所说的在这里回答我自己的问题;此消息来自会话设置,而不是来自触发器。因此,防止该消息的唯一方法是THROW出错,该错误会取消该会话(RAISERROR()不会取消该会话)。以下触发器不显示n row(s) affected

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)
于 2017-12-28T16:55:38.830 回答