2011-01-13 53 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的常見建議是使用它來抑制從觸發器內返回的其他行數。如果你使用它,它應該是觸發器體內的第一個語句。在你的樣本中,你將它作爲最後一個陳述,無論如何它都不會起作用。

相關問題