TRY と CATCH でエラー対応!

SQL Server における関数とストアドプロシージャの作成

Meghan Kwartler

IT Consultant

エラー処理は必要か

エラー処理とは?

  • エラーの予測・検知・解決
  • 実行の正常な流れを維持
  • 初期設計に組み込む

エラー処理がないと?

  • 突然の停止や実行中断
  • 文脈のない汎用的なエラーメッセージのみ
SQL Server における関数とストアドプロシージャの作成

まずは TRY

ALTER PROCEDURE dbo.cusp_TripSummaryCreate
  @TripDate nvarchar(30),
  @RideHrs numeric,

@ErrorMsg nvarchar(max) = null OUTPUT
AS BEGIN BEGIN TRY INSERT INTO TripSummary (Date, TripHours) VALUES (@TripDate, @RideHrs) END TRY ........
SQL Server における関数とストアドプロシージャの作成

CATCH の出番

ALTER PROCEDURE dbo.cusp_TripSummaryCreate
  @TripDate nvarchar(30),
  @RideHrs numeric, 
  @ErrorMsg nvarchar(max) = null OUTPUT
AS
BEGIN
  BEGIN TRY
      INSERT INTO TripSummary (Date, TripHours)
      VALUES (@TripDate, @RideHrs)
  END TRY
  BEGIN CATCH
      SET @ErrorMsg = 'Error_Num: ' +
      CAST (ERROR_NUMBER() AS varchar) +
      ' Error_Sev: ' + 
      CAST(ERROR_SEVERITY() AS varchar) +  
      ' Error_Msg: ' + ERROR_MESSAGE()
  END CATCH
END
SQL Server における関数とストアドプロシージャの作成

エラーを表示

DECLARE @ErrorMsgOut as nvarchar(max)

EXECUTE dbo.cusp_TripSummaryCreate 
        @TripDate = '1/32/2018',
        @RideHrs = 100,
        @ErrorMsg = @ErrorMsgOUT OUTPUT

SELECT @ErrorMsgOut as ErrorMessag
ErrorMessage
-------------------------------------------------
Error_Num: 241 Error_Sev: 16 
Error_Msg: Conversion failed when converting date and/or time from 
           character string
SQL Server における関数とストアドプロシージャの作成

THROW と RAISERROR の違い

THROW

  • SQL Server 2012 で導入
  • シンプルで使いやすい
  • 以降の文は実行されません

RAISERROR

  • SQL Server 7.0 で導入
  • 新規エラーを生成。元のエラー詳細(例: 発生行番号)にはアクセス不可
  • 以降の文は実行可能
SQL Server における関数とストアドプロシージャの作成

今度は CATCH しましょう!

SQL Server における関数とストアドプロシージャの作成

Preparing Video For Download...