bcp komutu ' ' yakınında yanlış sözdizimi. Karakter aslında: “ä”


11

Ben mssql-sunucu ve mssql-araçları Ubuntu (Linux) yüklü. Aşağıdaki komut satırını kullanarak bcp komutuyla veri aktarmaya çalıştığımda :

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

Bu hatayı alıyorum:

SQLState = 37000, NativeError = 102
Hata = [Microsoft] [SQL Server için ODBC Sürücüsü 13] [SQL Server] ' ' yakınında yanlış sözdizimi.

Olduğunu ä.

Eğer Täble_Nameköşeli parantez içine alırsam:

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

Nesne adında bu hatayı alıyorum:

SQLState = S0002, NativeError = 208
Hata = [Microsoft] [SQL Server için ODBC Sürücüsü 13] [SQL Server] Geçersiz nesne adı 'DBname.dbo.Täble_Name'.

Daha ileri gittim ve (Alıntılı Tanımlayıcıları etkinleştiren) seçeneği ''ile birlikte tek tırnak ekledim -q:

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

Hata şöyle olur:

SQLState = S0002, NativeError = 208
Hata = [Microsoft] [SQL Server için ODBC Sürücüsü 13] [SQL Server] Geçersiz nesne adı 'DBname.dbo.T ble_Name'.

Not: komut, bu özel karakter ä olmadan tablo adlarıyla mükemmel çalışır.

Yanıtlar:


7

Bu kabuk ve bcp / SQL Server arasında bir kodlama sorunu olduğuna inanıyorum . SQL Server UTF-16 Little Endian'ı bekliyor ancak Linux bunu kullanmıyor. Linux VM'm için varsayılan UTF-8'dir en_GB.UTF-8.

<TL; DR> "queryout" bcp komutunu kullanın ve "SELECT * FROM ...""out" komutunu kullanmak ve yalnızca bir tablo adı vermek yerine belirtin .

İşte benim testim ...


Kullanarak kullanılabilir yerel / kodlama listesi var:

$ locale -a

iade:

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

Bu seçeneklerden birkaçını ayarlayarak denedim:

$ export LC_CTYPE=C.UTF-8

ve daha sonra şunu kullanarak tekrar deneyin:

$ export LC_ALL=C.UTF-8

Hiçbir şey fark yaratmadı. Ve her seferinde -qve sonra birlikte çeşitli köşeli parantez kombinasyonları ile denedim -qve sonra hem birlikte hem de olmadan köşeli parantez yok -q.

Hatta UTF-16 LE karakterine denk olur bayt enjekte çalıştı äyoluyla $'\xe4\x00've hatta $'\xe4'$'\x00', ancak hiçbir iyileştirmeler.

ANCAK,

Ne yaptığını iş değişiyordu BCP gelen komutu outolmak yerine kadar queryoutve sonra tablo adı bir parçası olmak değişen SELECTaçıklamada (kaldırdım -r ~değil kaydırma yatay komut satırını yapmak sadece burada anahtar, ama benim test idi). Tabloyu oluşturdum [tempdb]ve aşağıdakileri çalıştırdım:

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

Orada sorun yok. Ama ilginç bir şekilde, aksanlıyı aksanlı äolmayan olarak değiştirdim a:

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

ve aşağıdaki hatayı aldı:

SQLState = S1000, NativeError = 0
Hata = [Microsoft] [SQL Server için ODBC Sürücüsü 13] Sütun düzeyi harmanlamaları çözülemedi

Bu, bcp'den gelen bir hatadır ve tempdbtest INTtablomdaki tek sütun veri türünü kullandığından, meta verilerine başvurmalıdır .

Şimdi, benim örnek düzeyinde Harmanlama aksan duyarlıdır, bu yüzden gerçekten aksanlı a("geçersiz nesne" hatası bekliyordum) çalışmasını beklemiyordum. Bu nedenle, aksan duyarsızlığını test etmek için, bir Harmanlama ile yeni bir Veritabanı Latin1_General_100_CI_AI_KS_WS_CSoluşturdum, aynı veritabanını yeni DB'de oluşturdum ve birkaç satır ekledim. Daha sonra aşağıdaki iki testi yaptım:

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

ve ikisi de çalıştı!

Sadece sorgu yerine tablo adını belirterek ilk bcp komutuna geri dönüp , almak ImportTest.dbo.[Table_Name]ve ImportTest.dbo.Table_Nameçalışmak mümkün . Ancak, yine de ImportTest.dbo.[Täble_Name]çalışmak için herhangi bir kombinasyon elde edemedim; tüm varyasyonlar öncekilerle aynı hatalara sahipti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.