MarkLogic: SQL-NOCOLUMN カラムが見つからないエラー
この記事では、MarkLogic の「SQL-NOCOLUMN」エラーに関する情報を説明します。
Date Entered: 3/10/2020 Last Updated: 3/10/2020 Author: James Baggs
この記事では、MarkLogic インスタンスからデータをクエリする際に CData ドライバーを通じて表示されることがある「Server error [SQL state: 08000]: SQL-NOCOLUMN: Column not found: main.employees.FirstName」というエラーメッセージについて説明します。この例では、Main はスキーマ名、Employees はテーブル名、FirstName はカラム名を表しています。
このエラーが発生する2つの原因
- SELECT ステートメント内のカラムがテーブルに存在しない
- カラムが一時的にオフラインになっている
この原因は比較的わかりやすく、特定やトラブルシューティングも容易です。MarkLogic の場合、CData は入力された SQL クエリに対して若干の解析と変換を行った後、SQL ステートメントを MarkLogic に送信します。そのため、この問題を解決するには、実際にテーブルに存在するカラムを含むようにクエリを修正するだけで済みます。例えば以下のようになります:
(invalid) SELECT SomeInvalidColumn FROM Customers.Purchases (valid) SELECT FirstName FROM main.employees
この問題の原因がカラムの「オフライン」状態である場合、問題は一時的なものです。MarkLogic のドキュメントには、再インデックス処理中にカラムが一時的にオフラインになるケースが記載されています:https://docs.marklogic.com/guide/sql/creating-template-views
トラブルシューティングと問題の原因特定
Verbosity を 4 に設定した CData ログファイルを確認すると、上記のどちらが問題の原因かについてより詳しい情報を得ることができます。ログファイルは、以下のように接続文字列プロパティに値を追加することで取得できます:
Logfile=C:\Users\Public\Documents\logfile.txt Verbosity=4ログファイル内には、CData が MarkLogic の sys_columns テーブルからカラムのメタデータを取得するセクションが記録されています:
2020-01-01T09:50:43.696-04:00 3 [Connection: 6] Query to send: SELECT "schema", "table", "name", "type", "notnull", "pk" FROM "sys"."sys_columns" WHERE ("schema" = 'main') AND ("table" = 'employees')
2020-01-01T09:50:43.698-04:00 3 [Connection: 6]DataIn, Length: 409
2020-01-01T09:50:43.699-04:00 4 [Connection: 6]
54 00 00 00 94 00 06 73 63 68 65 6D 61 00 00 00
00 00 00 00 00 00 04 13 FF FF 00 00 00 00 00 00
74 61 62 6C 65 00 00 00 00 00 00 01 00 00 04 13
FF FF 00 00 00 00 00 00 6E 61 6D 65 00 00 00 00
00 00 02 00 00 04 13 FF FF 00 00 00 00 00 00 74
79 70 65 00 00 00 00 00 00 03 00 00 04 13 FF FF
00 00 00 00 00 00 6E 6F 74 6E 75 6C 6C 00 00 00
00 00 00 04 00 00 00 10 00 04 00 00 00 00 00 00
70 6B 00 00 00 00 00 00 05 00 00 00 10 00 04 00
00 00 00 00 00 44 00 00 00 3A 00 06 00 00 00 04
6D 61 69 6E 00 00 00 09 65 6D 70 6C 6F 79 65 65
73 00 00 00 0A 45 6D 70 6C 6F 79 65 65 49 44 00
00 00 03 69 6E 74 00 00 00 01 31 00 00 00 01 30
44 00 00 00 3C 00 06 00 00 00 04 6D 61 69 6E 00
00 00 09 65 6D 70 6C 6F 79 65 65 73 00 00 00 09
46 69 72 73 74 4E 61 6D 65 00 00 00 06 73 74 72
69 6E 67 00 00 00 01 31 00 00 00 01 30 44 00 00
00 3B 00 06 00 00 00 04 6D 61 69 6E 00 00 00 09
65 6D 70 6C 6F 79 65 65 73 00 00 00 08 4C 61 73
74 4E 61 6D 65 00 00 00 06 73 74 72 69 6E 67 00
00 00 01 31 00 00 00 01 30 44 00 00 00 3B 00 06
00 00 00 04 6D 61 69 6E 00 00 00 09 65 6D 70 6C
6F 79 65 65 73 00 00 00 08 50 6F 73 69 74 69 6F
6E 00 00 00 06 73 74 72 69 6E 67 00 00 00 01 31
00 00 00 01 30 43 00 00 00 0D 53 45 4C 45 43 54
20 34 00 5A 00 00 00 05 49
2020-01-01T09:50:43.699-04:00 1 [Connection: 6] Executed column schema query: [employees], Success: 4 results (3 ms).
DataIn セクションから空白文字を除去し、16進数データリーダーツールを使用すると、MarkLogic から返されたカラムの文字列データを確認できます:
schema table name type notnull pk main employees EmployeeID int 1 0 main employees FirstName string 1 0 main employees LastName string 1 0 main employees Position string 1 0
この例では、FirstName が MarkLogic のメタデータで正しく返されており、送信クエリ内でもスペルとクォートエスケープが正しく処理されていることから、SQL-NOCOLUMN エラーは MarkLogic サーバーの再インデックス処理が原因であり、一時的な問題であると結論づけることができます。
残念ながら、MarkLogic API の sys_columns を通じてカラムが無効化されているかどうかを識別できる情報はありません(そのため、CData からその情報を表示することはできません)。また、カラムが一時的に無効化される期間に関する情報も CData では把握しておりません。
We appreciate your feedback. If you have any questions, comments, or suggestions about this entry, please contact our support team at support@cdata.co.jp.