none
呼び出し先のストアドでエラーが発生した場合の呼び出し元の行数を把握する方法はあるのでしょうか? RRS feed

  • 質問

  • 呼び出し先のストアドでエラーが発生した場合の呼び出し元の行数を把握する方法はあるのでしょうか?

    ストアドプロシージャのコーディングルールをまとめております。
    ストアドプロシージャでエラーが発生したときに
    どこでエラーが発生したのかが分かるようにスタックトレースを
    作っているのですが、ストアドの呼び出しが
    親子関係となっている場合に下記の問題があり、困っております。

    課題
      このストアドでエラーが発生した場合に、
      親のどの呼び出し行でエラーが発生したかを知りたいのですが、
      知る方法はあるのでしょうか?

    ご存知の方、アドバイスをお願いいたします。


    ↓今のエラーメッセージ

    メッセージ 50000、レベル 16、状態 1、プロシージャ Abe_Test02_01_Proc、行 51
    メッセージ 50000、レベル 16、状態 1、プロシージャ Abe_Test02_02_Proc、行 66、Microsoft SQL Server Management Studio - クエリ
    メッセージ 8134、レベル 16、状態 1、プロシージャ Abe_Test02_02_Proc、行 55、Microsoft SQL Server Management Studio - クエリ
    0 除算エラーが発生しました。

    ↓本当はこうしたい

    メッセージ 50000、レベル 16、状態 1、プロシージャ Abe_Test02_01_Proc、行 51
    メッセージ 50000、レベル 16、状態 1、プロシージャ Abe_Test02_01_Proc、行 41
    メッセージ 50000、レベル 16、状態 1、プロシージャ Abe_Test02_02_Proc、行 66、Microsoft SQL Server Management Studio - クエリ
    メッセージ 8134、レベル 16、状態 1、プロシージャ Abe_Test02_02_Proc、行 55、Microsoft SQL Server Management Studio - クエリ
    0 除算エラーが発生しました。

     

    親のストアド

     CREATE PROCEDURE [dbo].[Abe_Test02_01_Proc] 
     @Param1 nvarchar(max) = null, 
     @Param2 nvarchar(max) = null
     AS
     BEGIN TRY
     SET NOCOUNT ON;
     
     if @Param1 = N'Error1'
      RAISERROR(N'パラメータが{0}です。',16,1,@Param1) --31行
     declare @i int, @j int;
     set @i = 100
     set @j = 10;
     if @Param1 = N'Error2'
      set @j = 0;
     --0除算 
     set @i = @i / @j;  --39行
     --子を呼ぶ
     exec Abe_Test02_02_Proc @Param1, @Param2  --41行
     return 0
     END TRY
     BEGIN CATCH
     -- エラーメッセージ作成 
     DECLARE @errMsg nvarchar(max)
     EXEC @errMsg = MakeErrorMessage
     -- 例外を再スロー
     RAISERROR(@errMsg, 16, 1) --51行
     END CATCH
     GO
    

    子のストアド

     CREATE PROCEDURE [dbo].[Abe_Test02_02_Proc] 
     @Param1 nvarchar(max) = null, 
     @Param2 nvarchar(max) = null
     AS
     BEGIN TRY
     SET NOCOUNT ON;
     if @Param1 = N'Error3'
      RAISERROR(N'パラメータが{0}です。',16,1,@Param1) --47行
     declare @i int, @j int;
     set @i = 100
     set @j = 10;
     if @Param1 = N'Error4'
      set @j = 0;
     --0除算 
     set @i = @i / @j;  --55行
     exec Abe_Test02_03_Proc @Param1, @Param2
     return 0
     END TRY
     BEGIN CATCH
     -- エラーメッセージ作成 
     DECLARE @errMsg nvarchar(max)
     EXEC @errMsg = MakeErrorMessage
     -- 例外を再スロー
     RAISERROR(@errMsg, 16, 1) --66行
     END CATCH
     GO
    

    以上

     

    2011年4月29日 4:01

回答

  • こんにちは。
    T-SQLにはC#でいうところのthrowが用意されていませんので、
    RAISERRORしたところで例外が発生したと見なされてしまいます。
    これは仕様ですのでいかんともしがたいかなと思います。

    スタックトレースを作成するプロシージャを自作されているようなので、
    >エラーが発生した場合の呼び出し元の行数を把握する
    のも一緒に実装することはできそうですね。
    (ストアド呼び出し時に必ず行番号を記録しておく等)

    ※ あと、関係ないですがソースが読みにくいので出来ればインデントつけてくださるとありがたいです。

    以上、ご参考になれば幸いです。
    • 回答の候補に設定 山本春海 2011年6月6日 7:58
    • 回答としてマーク 山本春海 2011年6月10日 6:19
    2011年5月10日 20:50