Lệnh bcp Cú pháp không chính xác gần ' '. Nhân vật thực sự là:


11

Tôi đã cài đặt mssql-servermssql-tools trên Ubuntu (Linux). Khi tôi cố gắng xuất dữ liệu bằng lệnh bcp bằng dòng lệnh sau:

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

Tôi nhận được lỗi này:

SQLState = 37000, NativeError = 102
Error = [Microsoft] [ODBC Driver 13 cho SQL Server] [SQL Server] Cú pháp không chính xác gần ''.

Các ä.

Nếu tôi bao quanh Täble_Namedấu ngoặc vuông:

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

Tôi nhận được lỗi này trên tên đối tượng:

SQLState = S0002, NativeError = 208
Error = [Microsoft] [ODBC Driver 13 cho SQL Server] [SQL Server] Tên đối tượng không hợp lệ 'DBname.dbo.Täble_Name'.

Tôi đã đi xa hơn và thêm các trích dẫn đơn ''cùng với -qtùy chọn (cho phép Định danh trích dẫn):

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

Lỗi trở thành:

SQLState = S0002, NativeError = 208
Error = [Microsoft] [ODBC Driver 13 cho SQL Server] [SQL Server] Tên đối tượng không hợp lệ 'DBname.dbo.T ble_Name'.

NB: lệnh hoạt động hoàn hảo với tên bảng mà không có ký tự đặc biệt này.

Câu trả lời:


7

Tôi tin rằng đây là sự cố mã hóa giữa shell và bcp / SQL Server. SQL Server mong đợi UTF-16 Little Endian, nhưng Linux không sử dụng điều đó. Mặc định cho máy ảo Linux của tôi là UTF-8 thông qua en_GB.UTF-8.

<TL; DR> Sử dụng lệnh bcp "queryout" và chỉ định "SELECT * FROM ..."thay vì sử dụng lệnh "out" và chỉ cần cung cấp tên bảng.

Điều gì sau đây là thử nghiệm của tôi ...


Tôi đã nhận được danh sách các ngôn ngữ / mã hóa có sẵn bằng cách sử dụng:

$ locale -a

trả lại:

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

Tôi đã thử một vài trong số các tùy chọn đó bằng cách cài đặt:

$ export LC_CTYPE=C.UTF-8

và sau đó thử lại bằng cách sử dụng:

$ export LC_ALL=C.UTF-8

Dường như không có gì để làm cho một sự khác biệt. Và mỗi lần tôi thử với các kết hợp khác nhau của dấu ngoặc vuông mà không có -qvà sau đó -q, và sau đó không có dấu ngoặc vuông cả có và không có -q.

Tôi thậm chí đã thử tiêm các byte tương đương với ký tự UTF-16 LE äthông qua $'\xe4\x00'và thậm chí $'\xe4'$'\x00', nhưng không cải thiện.

TUY NHIÊN,

những gì đã làm công việc đã được thay đổi BCP lệnh từ outđể thay được queryout, và sau đó thay đổi tên bảng là một phần của một SELECTtuyên bố (tôi loại bỏ các -r ~chuyển đổi duy nhất ở đây để làm cho dòng lệnh không cuộn theo chiều ngang, nhưng nó đã được trong thử nghiệm của tôi). Tôi đã tạo bảng trong [tempdb]và chạy như sau:

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

Không có vấn đề ở đó. Nhưng thật thú vị, tôi đã thay đổi dấu äthành không dấu a:

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

và nhận được lỗi sau:

SQLState = S1000, NativeError = 0
Error = [Microsoft] [Trình điều khiển ODBC 13 cho máy chủ SQL] Không thể giải quyết các đối chiếu mức cột

Đó là lỗi từ bcp và phải tham khảo dữ liệu meta tempdbvì cột duy nhất trong bảng thử nghiệm của tôi sử dụng INTkiểu dữ liệu.

Bây giờ, Collation cấp độ cá thể của tôi nhạy cảm với giọng nói, vì vậy tôi không thực sự mong đợi phần không có dấu ahoạt động (mặc dù tôi đã mong đợi một lỗi "đối tượng không hợp lệ"). Vì vậy, để kiểm tra độ nhạy cảm của giọng nói, tôi đã tạo một Cơ sở dữ liệu mới với Collation of Latin1_General_100_CI_AI_KS_WS_CS, tạo cùng bảng đó trong DB mới và thêm một vài hàng. Sau đó tôi đã chạy hai bài kiểm tra sau:

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

và cả hai đã làm việc!

Quay trở lại lệnh bcp ban đầu chỉ cần chỉ định tên bảng thay vì truy vấn, tôi đã có thể nhận ImportTest.dbo.[Table_Name]ImportTest.dbo.Table_Namelàm việc. Tuy nhiên, tôi vẫn không thể có được sự kết hợp nào ImportTest.dbo.[Täble_Name]để làm việc; tất cả các biến thể có cùng một lỗi như trước đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.