web-dev-qa-db-ja.com

SQLはifステートメント内でのみスロー

いくつかの検証をいくつかのストアドプロシージャに追加していて、一部の変数がnullでないかどうかを確認する必要があります(それらはストアドプロシージャの前半で入力されています)。

以下のようなifステートメント内に「スロー」を追加しようとしています。

IF (@val is null)
BEGIN
    THROW 50001, 'Custom text', 1
END

これにより、スローの前にifステートメント内の他のコードが検索されるため、「スロー」で構文エラーが発生しますが、必要なのはifステートメント内でスローを実行することだけです。

ストアドプロシージャをできるだけ軽くして実行をできるだけ速く保つ必要があります。

誰かアイデアはありますか?

25
Edmund G
DECLARE @val NVARCHAR(50) = NULL
IF @val is null

    RAISERROR('Custom text', 16,16)

異なるレベルのチェック用

http://msdn.Microsoft.com/en-us/library/ms164086.aspx

1
Md. Parvez Alam

前のステートメントが終了していないため、構文エラーが表示されています。他の答えも機能しますが、これを行うには、THROWの直前にセミコロンをスローするか、すべてのステートメントをセミコロンで終了する癖をつけます。

IF (@val is null)
BEGIN
    ;THROW 50001, 'Custom text', 1
END

または

IF (@val is null)
BEGIN;
    THROW 50001, 'Custom text', 1;
END;

あなたはそれに気づいたかもしれません:

IF (@val is null)
    THROW 50001, 'Custom text', 1

...も機能します。これは、SQL ServerがIFステートメントの後に続くものが常に新しいT-SQLステートメントであることを認識しているためです。

Microsoftが将来のT-SQL言語では各ステートメントの後にセミコロンが必要になると述べているので、おそらく注目に値するので、今の習慣を構築することをお勧めします。

46
NReilingh

これがSQL Serverの場合、インテリセンス構文ハイライターはそれを好みませんが、コードはコンパイルして正常に実行する必要があります。もちろん、これは単一のステートメントなので、BEGIN...ENDブロックはまったく必要ありません。

IF (@val is null) THROW 50001, 'Custom text', 1