2016-03-30 24 views
0

プロシージャ内で動的SQLを実行中にSQL Serverがerror_procedureを実行できないのはなぜかと思います。シナリオ2のエラーメッセージでプロシージャ名を呼び出すことはできますか?エラー動的SQLの実行中にストアドプロシージャ名を取得する

シナリオ1:

CREATE PROCEDURE [dbo].[TEST_PROCEDURE] 
AS 
BEGIN 
    EXEC SELECT 1/0 
END 
GO 

EXEC TEST_PROCEDURE 

エラーメッセージ:

メッセージ8134、レベル16、状態1、プロシージャTEST_PROCEDURE、6行目
除算によってゼロにエラーが発生しました。

シナリオ2:

CREATE PROCEDURE [dbo].[TEST_PROCEDURE] 
AS 
BEGIN 
    EXEC('SELECT 1/0') 
END 
GO 

EXEC TEST_PROCEDURE 

エラーメッセージ:

メッセージ8134、レベル16、状態1、行1
除算によってゼロにエラーが発生しました。

+3

プロシージャを作成するときに右の構文を持っていないので、ええと、あなたの最初のシナリオは、エラーを取得しています。 EXECはストアドプロシージャを実行します(ストアドプロシージャ "SELECT"はありません)。 EXEC()は、大括弧で囲まれたパラメータを実行します。プロシージャー名を含むカスタム・エラー・メッセージを出力するには、TRY CATCHステートメントをプロシージャーに入れ、CATCHにカスタム・エラー・メッセージを入れます。 – ZLK

+0

お返事ありがとうございます!そうです、私はシナリオ2の手順を得るためにTRY CATCHメカニズムを使用できることを理解しました。 – 0070

+1

本当に別の方法はありません。特定のエラー情報をキャプチャするには、キャッチを頼むしかありません。また、ストアドプロシージャ内で何かを実行している場合、SQLはエラーに関して誤解を招くような情報を与える可能性があります。例えば100行のコードがある場合は、101行目に 'EXEC( 'SELECT 1/0')'を追加すると、行1にエラーがあると言います(これは実行されているコードの最初の行です)。 – ZLK

答えて

0
CREATE PROCEDURE [dbo].[TEST_PROCEDURE] 
AS 
BEGIN 
    BEGIN TRY 
     EXEC('SELECT 1/0') 
    END TRY 
    BEGIN CATCH 
     DECLARE @Err VARCHAR(255); 
     SELECT @Err = 'Error in TEST_PROCEDURE. ' + ERROR_MESSAGE() 
     RAISERROR(@Err, 16, -1) 
    END CATCH 
END 
関連する問題