Команда bcp Неправильний синтаксис поблизу ' '. Характер є насправді: “ä”


11

У мене в Ubuntu (Linux) встановлені mssql-сервер і mssql-інструменти . Коли я намагаюся експортувати дані за допомогою команди 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 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 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 13 для SQL Server] [SQL Server] Неправильне ім'я об’єкта 'DBname.dbo.T ble_Name'.

Примітка: команда прекрасно працює з іменами таблиць без цього спеціального символу ä.

Відповіді:


7

Я вважаю, що це проблема кодування між оболонкою та bcp / SQL Server. SQL Server очікує, що UTF-16 Little Endian, але Linux це не використовує. Типовим моїм Linux VM є UTF-8 via en_GB.UTF-8.

<TL; DR> Використовуйте «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.

Я навіть намагався вводити байти, які б прирівнювались до символу UTF-16 LE äчерез via $'\xe4\x00'і even $'\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, і вона повинна посилатися на метадані, tempdbоскільки єдиний стовпець у моїй тестовій таблиці використовує INTтип даних.

Тепер моє зіставлення рівня екземпляра чутливе до акцентів, тому я насправді aне сподівався на те, що не буде акцентовано діяти (хоча я очікував помилки "недійсного об'єкта"). Отже, щоб перевірити нечутливість до акцентів, я створив нову Базу даних із зіставленням 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]роботи; всі варіанти отримали ті ж помилки, що і раніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.