bcp command Неверный синтаксис рядом с ' '. Характер на самом деле: «ä»


11

У меня есть mssql-сервер и mssql-инструменты, установленные в 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
Ошибка = [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опцией (которая включает Quoted Identifiers):

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».

NB: команда отлично работает с именами таблиц без этого специального символа ä.

Ответы:


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'и даже $'\xe4'$'\x00', но без улучшений.

ОДНАКО,

то, что сработало, изменило команду bcp с outвместо вместо be 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тип данных.

Теперь мой Collation на уровне экземпляра чувствителен к акценту, поэтому я не ожидал, что не-акцентированный 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.