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

У меня есть 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
  Ошибка = [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: команда отлично работает с именами таблиц без этого специального символа.

11 голосов | спросил Houcine Nouri 18 MonEurope/Moscow2017-12-18T13:39:25+03:00Europe/Moscow12bEurope/MoscowMon, 18 Dec 2017 13:39:25 +0300 2017, 13:39:25

1 ответ


7

Я считаю, что это проблема кодирования между оболочкой и bcp /SQL Server. SQL Server ожидает UTF-16 Little Endian, но Linux не использует его. По умолчанию для моей Linux VM есть UTF-8 через en_GB.UTF-8.

<TL; DR> Используйте команду 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.

Я даже попытался ввести байты, которые будут соответствовать символу LE UTF-16 ä через $'\xe4\x00' и даже $'\xe4'$'\x00', но никаких улучшений.

ОДНАКО

что работа did меняла команду 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.

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

ответил Solomon Rutzky 18 MonEurope/Moscow2017-12-18T20:32:35+03:00Europe/Moscow12bEurope/MoscowMon, 18 Dec 2017 20:32:35 +0300 2017, 20:32:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132