4

(SQL 2005) レイザー エラーがストアド プロシージャを終了することは可能ですか。

たとえば、大規模なシステムで、予期しない値が特定の列に入力されたとします。更新トリガーで次のように記述します。

存在する場合 (select * from inserted where testcol = 7) begin raiseerror('My Custom Error', 16, 1) end

更新情報は引き続き適用されます。ただし、実行すると

存在する場合 (select * from inserted where testcol = 7) begin select 1/0 end

実際に更新を終了する 0 による除算エラーがスローされます。カスタムエラーメッセージを取得できるように、raiseerror でこれを行う方法はありますか?

4

4 に答える 4

6

トリガーでは、ROLLBACK、RAISERROR、および RETURN を発行します。

SQL Server でのエラー処理 - Erland Sommarskog によるトリガー コンテキストを参照してください。

于 2009-08-06T14:47:25.460 に答える
1

そもそも列が挿入されないように、列にCHECK制約を追加することはできませんか?

ALTER TABLE YourTable ADD CONSTRAINT CK_No_Nasties
    CHECK (testcol <> 7)

または、insert sproc (ある場合) でトランザクションを開始し、エラーが発生した場合はロールバックすることもできます。これは、SQL Server 2005 のTRYCATCHで実装でき、トリガーを使用する必要がなくなります。

于 2009-08-06T14:40:19.187 に答える
1
Begin try
@temp number
@temp=1/0
End try
Begin catch
@errormsg varchar(100)
@errormsg=error_massage()
Raiseerror(@errormsg,16,1)
End catch
于 2011-11-09T10:58:35.413 に答える
0

更新を実行する前に、有効なデータを確認する必要があります。

IF (@testvalue = 7)
    RAISERROR("Invalid value.", 16, 1);
ELSE
    UPDATE...
于 2009-08-06T14:38:54.163 に答える