エラーの構造と捕捉不可エラー

SQL Server におけるトランザクションとエラー処理

Miriam Antona

Software Engineer

エラーの構造

INSERT INTO products (product_name, stock, price)
    VALUES ('Trek Powerfly 5 - 2018', 10, 3499.99);
Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'unique_name'. 
Cannot insert duplicate key in object 'dbo.products'. 
The duplicate key value is (Trek Powerfly 5 - 2018).
SQL Server におけるトランザクションとエラー処理

エラーの構造

エラー番号

エラーメッセージで「Msg 2627」(エラー番号)が強調表示されている。

  • SQLのエラー: 1〜49999
  • 独自エラー: 50001〜
    select * from sys.messages
| message_id | language_id | severity | ... | text                                                            |
|------------|-------------|----------|-----|-----------------------------------------------------------------|
| ...        | ...         | ...      | ... | ...                                                             |
| 2627       | 1033        | 14       | ... | Violation of %ls constraint '%.*ls'. Cannot insert duplicate... |
| ...        | ...         | ...      | ... | ...                                                             |
SQL Server におけるトランザクションとエラー処理

エラーの構造

重大度レベル

エラーメッセージで「Level 14」(重大度レベル)が強調表示されている。

  • 0〜10:情報メッセージ
  • 11〜16:ユーザーが修正可能なエラー(制約違反など)
  • 17〜24:その他(ソフトウェア問題、致命的エラー)
SQL Server におけるトランザクションとエラー処理

エラーの構造

状態 (State)

エラーメッセージで「State 1」(エラーの状態)が強調表示されている。

  • 1:SQL Serverが表示するエラー
  • 0〜255:独自エラー
SQL Server におけるトランザクションとエラー処理

エラーの構造

行 (Line)

エラーメッセージで「Line 1」(エラーが発生した行)が強調表示されている。

プロシージャ

エラーメッセージで「Procedure Insert_product」(エラーが発生したストアドプロシージャ名)が強調表示されている。

SQL Server におけるトランザクションとエラー処理

捕捉不可エラー

  • 重大度 11未満(11〜19は捕捉可能)

  • 接続を停止する 重大度 20以上

  • コンパイル エラー:存在しないオブジェクトや列

SQL Server におけるトランザクションとエラー処理

捕捉不可エラー - コンパイルエラー例

BEGIN TRY
    SELECT non_existent_column FROM products;
END TRY
BEGIN CATCH
    SELECT 'You are in the CATCH block' AS message;
END CATCH
Msg 207, Level 16, State 1, Line 2
Invalid column name 'non_existent_column'.
SQL Server におけるトランザクションとエラー処理

練習しましょう!

SQL Server におけるトランザクションとエラー処理

Preparing Video For Download...