我正在使用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
。
如何抑制此输出?
答案 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)