SQLServerのメッセージ(エラー)を取得する

SQLServerでクエリを実行した際にエラーがあるとエラーメッセージが返されます。
例えば、存在しないテーブルに対してSELECT文を発行してデータを取得しようとした場合は、以下のようなメッセージが表示されます。

メッセージ 208、レベル 16、状態 1、行 1
オブジェクト名 ‘存在しないテーブル名’ が無効です。
発行したSQL

また、文字列(VARCHAR)を数値(INT)にCASTする際にエラーが発生すると、以下のようなメッセージが表示されます。

メッセージ 245、レベル 16、状態 1、行 1
varchar の値 ‘abc…xyz’ をデータ型 int に変換できませんでした。
発行したSQL

このエラーメッセージですが、実はSQLServerのシステム カタログビューで取得することができます。

今回はSQLServerのメッセージを取得する方法についてご紹介します。

メッセージを返すカタログ ビュー

メッセージはシステム カタログ ビューの「sys.messages」で取得することができます。
sys.messagesカタログビューは以下のデータを返します。

データ型 説明
message_id int メッセージを一意に識別するためのIDです。メッセージIDが50000未満の場合は、システム メッセージです。
language_id smallint 言語を識別するためのIDです。
severity tinyint メッセージの重大度レベルです。有効な値は1~25です。
is_event_logged bit エラーが発生するとイベントがログに記録されるかどうかを表します。この列の値が「1」であればイベントがログに記録されます。
text nvarchar(2048) メッセージのテキスト(内容)です。

sys.messagesからは様々な言語のメッセージを取得することができます。
以下にsys.messagesから取得できるメッセージの言語一覧を取得するSQLを記載します。

sys.messagesの言語一覧
言語ID
language_id
言語名
language_name
1028 Traditional Chinese
1029 Czech
1030 Danish
1031 German
1032 Greek
1033 English
1035 NULL
1036 French
1038 NULL
1040 Italian
1041 Japanese
1042 Korean
1043 Dutch
1044 Bokmål
1045 Polish
1046 Brazilian
1049 Russian
1053 Swedish
1055 Turkish
2052 Simplified Chinese
2070 Portuguese
3082 Spanish

日本語の言語ID(language_id)は「1041」になります。

日本語のメッセージを取得

日本語のメッセージは言語ID(language_id)が「1041」であることが分かったので、日本語のメッセージの一覧を取得します。

日本語のメッセージ一覧を取得するSQL

実行結果

日本語のメッセージ一覧を取得

メッセージID(message_id)を指定して特定のメッセージのみ取得する場合は以下のようになります。

上記の例では、冒頭のオブジェクトが存在しないエラーを示すメッセージIDが「245」の日本語のレコードを取得しています。

全言語のメッセージを取得

言語コード(language_id)を指定せずに取得すると次のようになります。

取得結果
言語ID 言語名 レベル ログ メッセージ
1028 繁體中文 16 0 將 %1! 值 ‘%2!’ 轉換成資料類型 %3! 時,轉換失敗。
1029 čeština 16 0 Převod datového typu %1! s hodnotou %2! na datový typ %3! se nezdařil.
1030 Dansk 16 0 Konverteringen mislykkedes, da %1!-værdien ‘%2!’ skulle konverteres til datatypen %3!.
1031 Deutsch 16 0 Fehler beim Konvertieren des %1!-Werts “%2!” in den %3!-Datentyp.
1032 ελληνικά 16 0 Η μετατροπή απέτυχε κατά τη μετατροπή της τιμής %1! ‘%2!’ στον τύπο δεδομένων %3!.
1033 us_english 16 0 Conversion failed when converting the %ls value ‘%.*ls’ to data type %ls.
1035 Suomi 16 0 Kohteen %1! arvon %2! muuntaminen tietotyypiksi %3! epäonnistui.
1036 Français 16 0 Échec de la conversion de la valeur %1! ‘%2!’ en type de données %3!.
1038 magyar 16 0 Az átalakítás leállt a(z) %1! érték („%2!”) %3! adattípusúvá való átalakításakor.
1040 Italiano 16 0 Conversione non riuscita durante la conversione del valore %1! ‘%2!’ nel tipo di dati %3!.
1041 日本語 16 0 %1! の値 ‘%2!’ をデータ型 %3! に変換できませんでした。
1042 한국어 16 0 %1! 값 ‘%2!’을(를) 데이터 형식 %3!(으)로 변환하지 못했습니다.
1043 Nederlands 16 0 De conversie van de %1!-waarde %2! naar gegevenstype %3! is mislukt.
1044 norsk (bokmål) 16 0 Konvertering mislyktes ved konvertering av %1!-verdien %2! til datatypen %3!.
1045 polski 16 0 Konwersja wartości „%2!” obiektu %1! na typ danych %3! nie powiodła się.
1046 Português (Brasil) 16 0 Falha ao converter o %1! valor ‘%2!’ para o tipo de dados %3!.
1049 русский 16 0 Ошибка преобразования значения %1! “%2!” в тип данных %3!.
1053 Svenska 16 0 Konvertering av %1! värdet av typen %2! till datatypen %3! misslyckades.
1055 Türkçe 16 0 %1! değeri ‘%2!’ %3! veri türüne dönüştürülürken işlem başarısız oldu.
2052 简体中文 16 0 在将 %1! 值 ‘%2!’ 转换成数据类型 %3! 时失败。
2070 Português 16 0 Falha ao converter o valor %1! ‘%2!’ no tipo de dados %3!.
3082 Español 16 0 Error de conversión al convertir el valor %1! ‘%2!’ al tipo de datos %3!.
参考URL

メッセージ (エラー) 用のカタログ ビュー – sys.messages