คำสั่ง bcp ไวยากรณ์ไม่ถูกต้องใกล้กับ ' ' ตัวละครเป็นจริง:“ ä”


11

ฉันมี mssql-serverและmssql-toolsติดตั้งบน 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
Error = [Microsoft] [ODBC Driver 13 สำหรับ 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 ไดรเวอร์ 13 สำหรับ SQL Server] [เซิร์ฟเวอร์ SQL] ชื่อวัตถุไม่ถูกต้อง '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 ไดรเวอร์ 13 สำหรับ SQL Server] [เซิร์ฟเวอร์ SQL] ชื่อวัตถุไม่ถูกต้อง 'DBname.dbo.T ble_Name'

NB: คำสั่งทำงานได้อย่างสมบูรณ์กับชื่อตารางโดยไม่มีอักขระพิเศษä

คำตอบ:


7

ฉันเชื่อว่านี่เป็นปัญหาการเข้ารหัสระหว่างเชลล์และbcp / SQL Server SQL Server คาดว่า UTF-16 Little Endian แต่ Linux ไม่ได้ใช้สิ่งนั้น ค่าเริ่มต้นสำหรับลินุกซ์ VM ของฉันคือ UTF-8 en_GB.UTF-8ผ่าน

<TL; DR>ใช้คำสั่ง"queryout" bcpและระบุ"SELECT * FROM ..."แทนการใช้คำสั่ง "out" และเพียงระบุชื่อตาราง

สิ่งที่ตามมาคือการทดสอบของฉัน ...


ฉันได้รับรายชื่อของสถานที่ / เข้ารหัสที่มีอยู่โดยใช้:

$ 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

ฉันยังพยายามฉีดไบต์ที่เทียบเท่ากับอักขระ UTF-16 LE ของäผ่าน$'\xe4\x00'และแม้กระทั่ง$'\xe4'$'\x00'แต่ไม่มีการปรับปรุง

อย่างไรก็ตาม

สิ่งที่ไม่ทำงานถูกเปลี่ยนBCPคำสั่งจากoutแทนที่จะเป็นqueryoutแล้วเปลี่ยนชื่อตารางเพื่อเป็นส่วนหนึ่งของ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 ไดรเวอร์ 13 สำหรับ SQL Server] ไม่สามารถแก้ไขการเปรียบเทียบระดับคอลัมน์

นั่นเป็นข้อผิดพลาดจากbcpและต้องอ้างถึง meta-data tempdbเนื่องจากคอลัมน์เดียวในตารางทดสอบของฉันใช้INTประเภทข้อมูล

ตอนนี้การจัดเรียงระดับอินสแตนซ์ของฉันมีความอ่อนไหวสำเนียงดังนั้นฉันไม่ได้คาดหวังว่าจะไม่เน้นเสียงaในการทำงาน (แม้ว่าฉันคาดว่าจะมีข้อผิดพลาด "วัตถุที่ไม่ถูกต้อง") ดังนั้นเพื่อทดสอบการเน้นความรู้สึกตัวฉันได้สร้างฐานข้อมูลใหม่ด้วย Collation of Latin1_General_100_CI_AI_KS_WS_CSสร้างตารางเดียวกันนั้นในฐานข้อมูลใหม่และเพิ่มแถวสองสามแถว จากนั้นฉันก็ทำการทดสอบสองข้อต่อไปนี้:

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.