SQLServerでクエリを実行した際にエラーがあるとエラーメッセージが返されます。
例えば、存在しないテーブルに対してSELECT文を発行してデータを取得しようとした場合は、以下のようなメッセージが表示されます。
オブジェクト名 ‘存在しないテーブル名’ が無効です。
1 |
SELECT * FROM [存在しないテーブル名]; |
また、文字列(VARCHAR)を数値(INT)にCASTする際にエラーが発生すると、以下のようなメッセージが表示されます。
varchar の値 ‘abc…xyz’ をデータ型 int に変換できませんでした。
1 |
SELECT CAST('abc...xyz' AS INT); |
このエラーメッセージですが、実は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を記載します。
1 2 3 4 5 6 7 8 9 10 11 12 |
-- sys.messagesの言語一覧 SELECT DISTINCT messages.language_id, syslanguages.name AS language_name FROM sys.messages LEFT OUTER JOIN sys.syslanguages ON messages.language_id = syslanguages.lcid ORDER BY messages.language_id; |
言語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」であることが分かったので、日本語のメッセージの一覧を取得します。
1 2 3 4 5 6 7 8 9 10 11 12 |
-- 日本語のメッセージ一覧を取得 SELECT message_id, severity, is_event_logged, text FROM sys.messages WHERE language_id = 1041 ORDER BY message_id; |
メッセージID(message_id)を指定して特定のメッセージのみ取得する場合は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-- 日本語のメッセージ一覧を取得 SELECT severity, is_event_logged, text FROM sys.messages WHERE message_id = 245 AND language_id = 1041 ORDER BY message_id; |
上記の例では、冒頭のオブジェクトが存在しないエラーを示すメッセージIDが「245」の日本語のレコードを取得しています。
全言語のメッセージを取得
言語コード(language_id)を指定せずに取得すると次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-- 全言語のメッセージ一覧を取得 SELECT messages.language_id, syslanguages.name AS language_name, messages.severity, messages.is_event_logged, messages.text FROM sys.messages LEFT OUTER JOIN sys.syslanguages ON messages.language_id = syslanguages.lcid WHERE message_id = 245 ORDER BY message_id, 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!. |