polecenie bcp Niepoprawna składnia w pobliżu ' '. W rzeczywistości postać to: „ä”


11

Mam MSSQL serwera i MSSQL narzędzia zainstalowane na Ubuntu (Linux). Kiedy próbuję wyeksportować dane za pomocą polecenia bcp, używając następującego wiersza polecenia:

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

Otrzymuję ten błąd:

SQLState = 37000, NativeError = 102
Error = [Microsoft] [ODBC Driver 13 for SQL Server] [SQL Server] Niepoprawna składnia w pobliżu ' '.

Jest ä.

Jeśli Täble_Nameotaczam nawiasy kwadratowe:

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

Otrzymuję ten błąd w nazwie obiektu:

SQLState = S0002, NativeError = 208
Error = [Microsoft] [ODBC Driver 13 for SQL Server] [SQL Server] Niepoprawna nazwa obiektu „DBname.dbo.Täble_Name”.

Poszedłem dalej i dodałem pojedyncze cudzysłowy ''wraz z -qopcją (która umożliwia Cytowane Identyfikatory):

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

Błąd staje się:

SQLState = S0002, NativeError = 208
Error = [Microsoft] [ODBC Driver 13 for SQL Server] [SQL Server] Niepoprawna nazwa obiektu „DBname.dbo.T ble_Name”.

Uwaga: polecenie działa doskonale z nazwami tabel bez tego znaku specjalnego ä.

Odpowiedzi:


7

Uważam, że jest to problem z kodowaniem między powłoką a programem bcp / SQL Server. SQL Server oczekuje UTF-16 Little Endian, ale Linux tego nie używa. Domyślnie dla mojej maszyny wirtualnej z systemem Linux jest UTF-8 przez en_GB.UTF-8.

<TL; DR> Użyj polecenia bcp „queryout” i podaj "SELECT * FROM ..."zamiast polecenia „out” i po prostu podaj nazwę tabeli.

Poniżej znajdują się moje testy ...


Mam listę dostępnych ustawień regionalnych / kodowania przy użyciu:

$ locale -a

zwrócony:

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

Wypróbowałem kilka z tych opcji, ustawiając:

$ export LC_CTYPE=C.UTF-8

a następnie spróbuj ponownie za pomocą:

$ export LC_ALL=C.UTF-8

Wydawało się, że nic nie robi różnicy. I za każdym razem próbowałem z różnymi kombinacjami nawiasów kwadratowych bez, -qa następnie z -q, a następnie bez nawiasów kwadratowych zarówno z jak i bez -q.

Próbowałem nawet wstrzykiwać bajty, które byłyby równe znakowi UTF-16 LE z ävia, $'\xe4\x00'a nawet $'\xe4'$'\x00', ale bez ulepszeń.

JEDNAK,

co zrobił praca została zmieniając bcp polecenie out, aby zamiast być queryout, a następnie zmienia nazwę tabeli, aby być częścią SELECTrachunku (usunąłem -r ~przełącznik tylko po to, aby z wiersza poleceń nie przewijania w poziomie, ale to było w moim testowania). Utworzyłem tabelę [tempdb]i uruchomiłem następujące:

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

Nie ma tam problemów. Ale co ciekawe, zmieniłem akcent äna nieakcentowany a:

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

i otrzymał następujący błąd:

SQLState = S1000, NativeError = 0
Error = [Microsoft] [ODBC Driver 13 for SQL Server] Nie można rozwiązać zestawień na poziomie kolumny

Jest to błąd bcp i musi odnosić się do metadanych, tempdbponieważ jedyna kolumna w mojej tabeli testowej używa INTtypu danych.

Teraz moje sortowanie na poziomie instancji jest wrażliwe na akcent, więc tak naprawdę nie spodziewałem się, że nieakcentowany azadziała (chociaż spodziewałem się błędu „nieprawidłowego obiektu”). Aby przetestować niewrażliwość na akcent, utworzyłem nową bazę danych z sortowaniem Latin1_General_100_CI_AI_KS_WS_CS, utwórz tę samą tabelę w nowej bazie danych i dodałem kilka wierszy. Następnie przeprowadziłem następujące dwa testy:

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

i oba działały!

Wracając do początkowej komendy bcp, polegającej na określeniu nazwy tabeli zamiast zapytania, mogłem dostać się ImportTest.dbo.[Table_Name]i ImportTest.dbo.Table_Namepracować. Jednak nadal nie byłem w stanie uzyskać żadnej kombinacji ImportTest.dbo.[Täble_Name]pracy; wszystkie odmiany miały takie same błędy jak poprzednio.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.