perintah bcp Sintaks yang salah di dekat ' '. Karakter sebenarnya: "ä"


11

Saya memiliki mssql-server dan mssql-tools yang diinstal di Ubuntu (Linux). Ketika saya mencoba untuk mengekspor data dengan perintah bcp menggunakan baris perintah berikut:

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

Saya mendapatkan kesalahan ini:

SQLState = 37000, NativeError = 102
Kesalahan = [Microsoft] [Driver ODBC 13 untuk SQL Server] [SQL Server] Sintaksis salah dekat ' '.

The adalah ä.

Jika saya mengelilingi Täble_Namedengan kurung:

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

Saya mendapatkan kesalahan ini pada nama objek:

SQLState = S0002, NativeError = 208
Kesalahan = [Microsoft] [Driver ODBC 13 untuk SQL Server] [SQL Server] Nama objek tidak benar 'DBname.dbo.Täble_Name'.

Saya melangkah lebih jauh dan menambahkan tanda kutip tunggal ''bersama dengan -qopsi (yang memungkinkan Pengidentifikasi Dikutip):

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

Kesalahannya menjadi:

SQLState = S0002, NativeError = 208
Kesalahan = [Microsoft] [Driver ODBC 13 untuk SQL Server] [SQL Server] Nama objek tidak benar 'DBname.dbo.T ble_Name'.

NB: perintah ini berfungsi dengan baik dengan nama tabel tanpa karakter khusus ini ä.

Jawaban:


7

Saya percaya bahwa ini adalah masalah penyandian antara shell dan bcp / SQL Server. SQL Server mengharapkan UTF-16 Little Endian, tetapi Linux tidak menggunakannya. Default untuk VM Linux saya adalah UTF-8 via en_GB.UTF-8.

<TL; DR> Gunakan perintah bcp "queryout" dan tentukan "SELECT * FROM ..."alih-alih menggunakan perintah "out" dan cukup memberikan nama tabel.

Berikut ini adalah pengujian saya ...


Saya mendapat daftar lokal / penyandian menggunakan:

$ locale -a

dikembalikan:

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

Saya mencoba beberapa opsi dengan menetapkan:

$ export LC_CTYPE=C.UTF-8

dan kemudian coba lagi menggunakan:

$ export LC_ALL=C.UTF-8

Tampaknya tidak ada yang membuat perbedaan. Dan setiap kali saya mencoba dengan berbagai kombinasi kurung kotak tanpa -qdan kemudian dengan -q, dan kemudian tidak ada kurung kotak dengan dan tanpa -q.

Saya bahkan mencoba menyuntikkan byte yang akan menyamakan dengan karakter UTF-16 LE ävia $'\xe4\x00'dan genap $'\xe4'$'\x00', tetapi tidak ada perbaikan.

NAMUN,

apa yang lakukan pekerjaan yang mengubah bcp perintah dari outbukan untuk menjadi queryout, dan kemudian mengubah nama tabel untuk menjadi bagian dari SELECTpernyataan (saya dihapus -r ~beralih hanya di sini untuk membuat baris perintah tidak gulir horizontal, tapi itu dalam pengujian saya). Saya membuat tabel [tempdb]dan menjalankan yang berikut:

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

Tidak ada masalah di sana. Tapi yang cukup menarik, saya mengubah aksen äke non-aksen a:

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

dan menerima kesalahan berikut:

SQLState = S1000, NativeError = 0
Error = [Microsoft] [ODBC Driver 13 untuk SQL Server] Tidak dapat menyelesaikan pemeriksaan level kolom

Itu adalah kesalahan dari bcp dan harus merujuk ke meta-data tempdbkarena satu-satunya kolom dalam tabel pengujian saya menggunakan INTtipe data.

Sekarang, Collation tingkat instance saya peka-aksen, jadi saya tidak benar-benar mengharapkan non-aksen abekerja (meskipun saya memang mengharapkan kesalahan "objek tidak valid"). Jadi, untuk menguji ketidaksensitifan aksen, saya membuat Database baru dengan Collation of Latin1_General_100_CI_AI_KS_WS_CS, membuat tabel yang sama di DB baru, dan menambahkan beberapa baris. Saya kemudian menjalankan dua tes berikut:

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

dan keduanya bekerja!

Kembali ke perintah bcp awal hanya menentukan nama tabel, bukan kueri, saya bisa mendapatkan ImportTest.dbo.[Table_Name]dan ImportTest.dbo.Table_Namebekerja. Namun, saya masih tidak bisa mendapatkan kombinasi ImportTest.dbo.[Täble_Name]untuk bekerja; semua variasi mendapat kesalahan yang sama seperti sebelumnya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.