Sql server 触发和禁用“;“受影响的行”;消息

Sql server 触发和禁用“;“受影响的行”;消息,sql-server,sql-server-2005,triggers,Sql Server,Sql Server 2005,Triggers,我有一个触发器类型,而不是插入、更新。 如下所示: 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; 问题是,在第三个“else”选项中,我只想显示错误消息,而不显示任何“受影响的行”消息。 别指望你为我工

我有一个触发器类型,而不是插入、更新。 如下所示:

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;
问题是,在第三个“else”选项中,我只想显示错误消息,而不显示任何“受影响的行”消息。 别指望你为我工作。我已经尝试过不同的配置,把这个和不返回。我的声明中到处都提到了这一点。 它在任何地方都不起作用。我使用SQL Server 2005,有人能帮我吗?
应始终显示受影响的行。唯一的例外是else语句。

使用
设置NOCOUNT ON在查询之前,然后使用
GO

SET NOCOUNT ON;
GO

在一个简化示例中:

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行受影响”消息的唯一方法是回滚事务(在错误消息之后包括回滚)。这将产生以下结果:

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的通常建议是使用它来抑制从触发器中返回的额外行数。如果要使用它,它应该是触发器主体中的第一条语句。在您的示例中,它是最后一个语句,无论如何都不会有任何效果。

什么不起作用?错误消息是什么?我的意思是我仍然看到1行受影响的消息。