当没有数据表行被更改时,触发 NOCOUNT 输出 1 或更多行受到影响
Trigger with NOCOUNT outputs 1 or more row(s) affected when no datatable rows were changed
我正在使用 SQL Server 2012。我在一个视图上有触发器,目的是允许我的用户像其他 table 一样对其执行 DML 操作。这些触发器有 SET NOCOUNT ON
并且有许多 IF...RAISERROR(...) RETURN
语句来捕获逻辑错误。我注意到,即使在不影响任何基础 tables 的情况下返回触发器,SSMS 也会输出 "n or more row(s) affected",其中 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
。
如何抑制此输出?
以下将阻止此消息返回到控制台。
它与会话设置有关,与触发代码无关
set nocount on
insert into viewTest select...
set nocount off
根据@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)
我正在使用 SQL Server 2012。我在一个视图上有触发器,目的是允许我的用户像其他 table 一样对其执行 DML 操作。这些触发器有 SET NOCOUNT ON
并且有许多 IF...RAISERROR(...) RETURN
语句来捕获逻辑错误。我注意到,即使在不影响任何基础 tables 的情况下返回触发器,SSMS 也会输出 "n or more row(s) affected",其中 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
。
如何抑制此输出?
以下将阻止此消息返回到控制台。 它与会话设置有关,与触发代码无关
set nocount on
insert into viewTest select...
set nocount off
根据@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)