2009-08-06 7 views
4

(SQL 2005) raiserrorがストアドプロシージャを終了することは可能ですか?RAISERRORを使用したSQL文の終了

たとえば、大規模なシステムでは、特定の列に入力されないと予想される値があります。更新トリガでは、書いた場合:存在

場合 RAISEERROR(マイカスタムエラー '、16、1) 終了

を開始し、更新情報がまだある(ここで、testcol = 7挿入SELECT * FROM)適用される。存在する場合は を開始(testcol = 7がどこに挿入SELECT * FROM)

を実行する場合 しかし1/0 エンド

を選択0除算エラーは、実際には更新を終了するようにスローされます。 私はraiseerrorでこれを行うことができますので、カスタムエラーメッセージを返すことができますか?

答えて

6

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

は、チェックと更新の間でデータが変更された場合Error Handling in SQL Server - Trigger Context by Erland Sommarskog

+0

また、このリンクhttp://support.microsoft.com/kb/45581 – pjp

+0

これはトランザクションでのみ有効ですか?またはtrasactionalトリガされていますか? – Bob

+0

明示的なトランザクション内にない各SQL文が事実上1つの文のトランザクションであるため、トリガ内では、一致するBEGIN TRANSACTION文は必要ありません。 – pjp

0

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

IF (@testvalue = 7) 
    RAISERROR("Invalid value.", 16, 1); 
ELSE 
    UPDATE... 
+0

何を参照してください? –

+0

この例のデータは入力パラメータであり、sprocが明示的にそれを変更しない限り変更しないでください。 – pjp

+0

sprocがこれを更新しているのか、その夜間のデータベースジョブなのかわからないので、更新する前に値をチェックすることができません。 – Bob

1

は、あなただけの最初の場所に挿入されるのを防ぐために列にCHECK制約を追加できませんか?

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

また、sprocを(もしあれば)挿入してトランザクションを開始し、エラーが発生した場合はロールバックすることもできます。これは、SQL Server 2005でTRY,CATCHと実装でき、トリガーを使用しなくても済みます。

1
Begin try 
@temp number 
@temp=1/0 
End try 
Begin catch 
@errormsg varchar(100) 
@errormsg=error_massage() 
Raiseerror(@errormsg,16,1) 
End catch 
+1

ソリューションの説明を追加できますか? – Ren