2017-12-27 21 views
0

SQL Server 2012を使用しています。ユーザーがDMLアクションを実行できるようにするために、他のテーブル。これらのトリガーにはSET NOCOUNT ONがあり、論理エラーをキャッチするために多くのIF...RAISERROR(...) RETURNステートメントがあります。私は、基になるテーブルに影響を与えずにトリガが返された場合でも、SSMSは「影響を受けるn個以上の行」を出力することに気付きました。ここで、nはビュー内で影響を受ける行の数です。NOCOUNT出力のトリガーは、データテーブル行が変更されていない場合に1つ以上の行に影響を受けます。

CREATE TRIGGER dbo.triggerViewTest 
ON dbo.viewTest 
INSTEAD OF INSERT AS 
BEGIN 
    SET NOCOUNT ON 
    IF 1 != 0 
    BEGIN 
     RAISERROR('No rows should be affected!', 16, 1) 
     RETURN 
    END 
END 

INSERT INTO dbo.viewTest (columnA) VALUES (1) 

とSSMS 1 row(s) affectedを出力します。だから、私は同じ結果で、次のような単純なトリガーをテストしました。

この出力を抑制するにはどうすればよいですか?

+0

を。 –

答えて

1

このメッセージがコンソールに返されないようにするには、次のようにします。 それは@Eralperが言ったことに基づいて、ここで自分の質問に答えるトリガコード

set nocount on 
insert into viewTest select... 
set nocount off 
+0

これは答えとしてマークしています。セッション設定と関連しています...がこの動作の理由であり、そのメッセージがエラーを「スロー」するのを防ぐ唯一の方法が判明しました。 – zambonee

0

でないセッション設定と関連しています。このメッセージはセッション設定からのものであり、トリガーからのものではありません。したがって、メッセージを防止する唯一の方法は、THROWにエラーを送り、そのセッションをキャンセルします(RAISERROR()はセッションをキャンセルしません)。次のトリガーはn row(s) affectedを表示しません:*インサート*からの行数ではなく、トリガによって取られた行動によって、行数です

CREATE TRIGGER dbo.triggerViewTest 
ON dbo.viewTest 
INSTEAD OF INSERT AS 
BEGIN 
    SET NOCOUNT ON 
    IF 1 != 0 
    BEGIN 
     ;THROW 50000, 'No rows should be affected!', 1 
    END 
END 

INSERT INTO dbo.viewTest (columnA) VALUES (1) 
関連する問題