触发并禁用“受影响的行”消息

时间:2011-01-13 08:01:52

标签: sql-server sql-server-2005 triggers

我有一个触发类型INSTEAD OF Insert,Update。 它看起来像下面这样:

IF EXISTS(some select staement) 
 updade
 set
 where
 ELSE IF (some other select staement)
    insert
    values
 ELSE--(3)
RAISERROR ('msg',16,1)
RETURN; SET NOCOUNT ON;

问题是在第3个 - “else”选项中我想只显示错误消息而没有任何“受影响的行”消息。 设置NOCOUNT ON对我不起作用。我已经尝试过不同的配置,无论如何都可以使用。在我的发言中,我把它推到了各处。 它无处不在。我使用SQL Server 2005可以请任何人帮助我吗? 总是会出现影响按摩的行。唯一的例外是else语句。

2 个答案:

答案 0 :(得分:6)

在查询前使用SET NOCOUNT ON;,然后使用GO

SET NOCOUNT ON;
GO

答案 1 :(得分:3)

在一个简化的例子中:

create table T (
    ID int not null
)
go
create trigger TT
on T
instead of insert
as
    RAISERROR('No',16,1)
go
insert into T (ID)
select 1

我们得到了输出:

Msg 50000, Level 16, State 1, Procedure TT, Line 5
No

(1 row(s) affected)

抑制“1行受影响”消息的唯一方法是回滚事务(通过在错误消息之后包含ROLLBACK)。而这将产生这一点:

Msg 50000, Level 16, State 1, Procedure TT, Line 5
No
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.

无法进一步抑制这些消息。 “1行受影响”消息正在外部作用域(运行INSERT语句的作用域)中生成,而不是在触发器的作用域内生成,并且正在生成,因为触发器正在运行完成 - 到目前为止就外部陈述而言,这是成功的。

关于NOCOUNT的通常建议是使用它来抑制从触发器中返回的其他行计数。如果你正在使用它,它应该是触发器体内的第一个语句。在你的样本中,你将它作为最后一个语句,无论如何它都没有效果。