当没有更改数据表行时,触发NOCOUNT输出1个或更多行受影响

时间:2017-12-27 23:03:26

标签: sql-server tsql database-trigger nocount

我正在使用SQL Server 2012.我在视图上有触发器,目的是允许我的用户像对待任何其他表一样对其执行DML操作。这些触发器具有IF...RAISERROR(...) RETURN并且有许多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输出&n;或更多行受影响"其中n是视图中受影响的行数。所以,我测试了以下简单的触发器,结果相同:

1 row(s) affected

SSMS打印ALL_OBJECTS

如何抑制此输出?

2 个答案:

答案 0 :(得分:1)

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

无关
set nocount on
insert into viewTest select...
set nocount off

答案 1 :(得分: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)