2011-01-13 59 views
2

我有一个触发器类型INSTEAD插入,更新。 它看起来像下面的东西:触发器和禁用“受影响的行”消息

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日 - “其他”选项,我想只显示错误消息,没有任何“受影响的行(S)”的消息。 SET NOCOUNT ON dosen't work for me。我已经尝试了不同的配置,把这个和没有回报。在我的发言中,我被无处不在。 它无法在任何地方工作。我使用SQL Server 2005有人可以帮我吗? 行受影响的按摩应该始终显示。唯一的例外是其他声明。

+2

什么都不行? msg的错误是什么? – 2011-01-13 08:07:11

回答

6

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

SET NOCOUNT ON; 
GO 
+0

对不起,不起作用:( – truthseeker 2011-01-13 08:27:57

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行受影响”消息Sage是回滚事务(通过在错误消息之后包含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. 

没有办法来进一步压制这些消息。在外部范围(运行INSERT语句的范围)中生成“1行受影响”消息,而不是在触发器的范围内生成,并且由于触发器正在运行以完成而生成 - 因此,外部声明关注,这是成功的。

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

相关问题