2017-05-15 25 views
3

私はそれについて多くの決定があることを知っています。まだ 多くの場合、プロシージャがあれば、結果を選択してプロシージャを終了します。 それGOTOステートメントを使用、またはより良い方法(古典ないif...else)を持っている良いSqlServer GOTOを選択して終了する手順

例:

create procedure MyProc @Parm int 
as 
    declare @Result nvarchar(50) 

    set @Result = 'OK' 

    if @Parm = 1 begin 
     set @Result = 'Error Example 1' 
     goto ExitProc; 
    end 

    if @Parm = 2 begin 
     set @Result = 'Error Example 2' 
     goto ExitProc; 
    end 

    if @Parm = 3 begin 
     set @Result = 'Error Example 3' 
     goto ExitProc; 
    end 

    ect... 

    ExitProc: 

    select @Result as Result, 100 as P2 
    from Table1 
+2

後藤は良い解決策になることはありません。これについて多くのことが書かれており、数十年前に禁止されています。古典的なif..elseが最良の解決策ですが、何が間違っていますか? – GuidoG

答えて

3

あなたがそれらを必要なときにあなたの本当のコードが...もしそうでないならば、単一の構造よりも複雑である聖霊降臨祭は、(コメントに言ったように)、あなたはあなた自身の例外を発生させることができ、終了するには、ストアドプロシージャを強制的にアプリケーションにエラーを通知する。

例:彼らは、他のSQLエラーであるかのように

create procedure MyProc @Parm int 
as 
    if @Parm = 1 begin 
     THROW 60001, 'Error Example 1', 1; 
    end 

    if @Parm = 2 begin 
     THROW 60001, 'Error Example 2', 2; 
    end 

    if @Parm = 3 begin 
     THROW 60001, 'Error Example 3', 3; 
    end 

    ... 

今、あなたのアプリケーションは、SQL Serverによってスローされたこれらの例外をキャッチすることができます。

これらのエラーをストアドプロシージャ自体でキャッチして処理することもできますが、アプリケーションでキャッチすることはよりエレガントです。ストアドプロシージャのエラーをキャッチする

例:

create procedure MyProc @Parm int 
as 

    begin try 
     if @Parm = 1 begin 
     THROW 60001, 'Error Example 1', 1; 
     end 

     if @Parm = 2 begin 
     THROW 60001, 'Error Example 2', 2; 
     end 

     if @Parm = 3 begin 
     THROW 60001, 'Error Example 3', 3; 
     end 

     ... 
    end try 

    begin catch 
     select error_message() as Result, 100 as P2 
     from Table1 
    end catch 
+0

非常に良いアイデア。ありがとうございました。それは受け入れられますか? – inon

+1

catchブロックで、「set @@ Result = error_message()」を追加しました。 "set @@ Result = '...'"の代わりに – inon

+1

はい、他のSQLエラー(参照エラー、0による除算...)をキャッチしているので、はるかに優れています。 )、error_message()には常に正しい記述があります。私は答えを修正します。 –

0

かわりGOTOCASEを使用することができます。

CREATE PROCEDURE MyProc @Parm int AS 
    DECLARE @Result nvarchar(50) 

    SELECT 100 as P2, @Result = CASE @Parm 
         WHEN 1 THEN 'Error Example 1' 
         WHEN 2 THEN 'Error Example 2' 
         WHEN 2 THEN 'Error Example 3' 
         ELSE 'OK' 
        END 
関連する問題