bcpコマンド「 」付近の構文が正しくありません。キャラクターは実際には「ä」


11

私が持っている MSSQLサーバMSSQL・ツールのUbuntu(Linux)の上に設置します。次のコマンドラインを使用してbcpコマンドでデータをエクスポートしようとすると、

bcp DBname.dbo.Täble_Name out Täble_Name -c -k  -S127.0.0.1 -Usa -PpassWord -r ~

私はこのエラーを受け取ります:

SQLState = 37000、NativeError = 102
エラー= [Microsoft] [ODBC Driver 13 for SQL Server] [SQL Server]「 」付近の構文が正しくありません。

ですä

私は囲む場合はTäble_Name角括弧で:

 bcp DBname.dbo.[Täble_Name] out Täble_Name -c -k  -S127.0.0.1 -Usa -PpassWord -r ~

オブジェクト名でこのエラーが発生します:

SQLState = S0002、NativeError = 208
エラー= [Microsoft] [ODBC Driver 13 for SQL Server] [SQL Server]無効なオブジェクト名 'DBname.dbo.Täble_Name'。

さらに進ん''で、-qオプション(引用識別子を有効にする)と共に単一引用符を追加しました。

bcp 'DBname.dbo.[Täble_Name]' out Täble_Name -c -k  -S127.0.0.1 -Usa -PpassWord -r ~ -q

エラーは次のようになります。

SQLState = S0002、NativeError = 208
エラー= [Microsoft] [ODBC Driver 13 for SQL Server] [SQL Server]無効なオブジェクト名 'DBname.dbo.T ble_Name'。

注意:コマンドは、この特殊文字äがなくても、テーブル名で完全に機能します。

回答:


7

これはシェルとbcp / SQL Server 間のエンコーディングの問題だと思います。SQL ServerはUTF-16リトルエンディアンを想定していますが、Linuxはそれを使用していません。Linux VMのデフォルトはを介したUTF-8 en_GB.UTF-8です。

<TL; DR>「out」コマンドを使用する代わりに「queryout」bcpコマンド"SELECT * FROM ..."を使用して指定し、単にテーブル名を指定します。

以下は私のテストです...


私は使用可能なロケール/エンコーディングのリストを取得しました:

$ locale -a

戻ってきた:

C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX

私はこれらのオプションのいくつかを設定して試しました:

$ export LC_CTYPE=C.UTF-8

その後、次を使用して再試行します:

$ export LC_ALL=C.UTF-8

何も変化をもたらさないようでした。そして、角括弧のさまざまな組み合わせを試してみましたが、角括弧の有無にかかわらず-q、角括弧の有無にかかわらず、-q角括弧はありませんでした-q

私は、ävia $'\xe4\x00'およびeven のUTF-16 LE文字に相当するバイトを注入することも試みました$'\xe4'$'\x00'が、改善はありませんでした。

しかしながら、

機能したのbcpコマンドをからoutqueryout変更し、次にテーブル名をSELECTステートメントの一部に変更することです(-r ~コマンドラインを水平にスクロールしないようにするために、ここでのみスイッチを削除しましたが、テスト中です)。でテーブルを作成[tempdb]し、以下を実行しました。

bcp "SELECT * FROM tempdb.dbo.[Täble_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass

そこに問題はありません。しかし、興味深いことに、アクセントäをアクセントなしに変更しましたa

bcp "SELECT * FROM tempdb.dbo.[Table_Name]" queryout tab -c -k  -S127.0.0.1 -Usa -Ppass

次のエラーを受け取りました:

SQLState = S1000、NativeError = 0
エラー= [Microsoft] [ODBC Driver 13 for SQL Server]列レベルの照合順序を解決できません

これはbcpからのエラーtempdbであり、テストテーブルの唯一の列がINTデータ型を使用しているため、メタデータを参照している必要があります。

現在、インスタンスレベルの照合順序はアクセントを区別するため、非アクセント記号が機能することを実際には期待していませんでしたa(ただし、「無効なオブジェクト」エラーを予期していました)。したがって、アクセント非依存性をテストするために、Collat​​ion of Latin1_General_100_CI_AI_KS_WS_CSを使用して新しいデータベースを作成し、新しいDBに同じテーブルを作成して、いくつかの行を追加しました。次に、次の2つのテストを実行しました。

bcp "SELECT * FROM ImportTest.dbo.[Täble_Name]" queryout tab -c -k  -S127.0.0.1 -Usa -Ppass

bcp "SELECT * FROM ImportTest.dbo.[Table_Name]" queryout tab -c -k  -S127.0.0.1 -Usa -Ppass

そして両方が働いた!

クエリの代わりにテーブル名を指定するだけの最初のbcpコマンドに戻ると、取得ImportTest.dbo.[Table_Name]ImportTest.dbo.Table_Nameて作業することができました。しかし、私はまだどの組み合わせも機能させることができませんでしたImportTest.dbo.[Täble_Name]。すべてのバリエーションで以前と同じエラーが発生しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.