我有一个触发类型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语句。
答案 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的通常建议是使用它来抑制从触发器中返回的其他行计数。如果你正在使用它,它应该是触发器体内的第一个语句。在你的样本中,你将它作为最后一个语句,无论如何它都没有效果。