bcp-Befehl Falsche Syntax in der Nähe von ' '. Zeichen ist eigentlich: "ä"


11

Ich habe mssql-server und mssql-tools unter Ubuntu (Linux) installiert. Wenn ich versuche, Daten mit dem Befehl bcp über die folgende Befehlszeile zu exportieren :

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

Ich erhalte diesen Fehler:

SQLState = 37000, NativeError = 102
Error = [Microsoft] [ODBC-Treiber 13 für SQL Server] [SQL Server] Falsche Syntax in der Nähe von ' '.

Das ist ä.

Wenn ich das Täble_Namemit eckigen Klammern umgeben habe:

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

Ich erhalte diesen Fehler beim Objektnamen:

SQLState = S0002, NativeError = 208
Error = [Microsoft] [ODBC-Treiber 13 für SQL Server] [SQL Server] Ungültiger Objektname 'DBname.dbo.Täble_Name'.

Ich ging weiter und fügte einfache Anführungszeichen ''zusammen mit der -qOption hinzu (die Quoted Identifiers aktiviert):

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

Der Fehler wird:

SQLState = S0002, NativeError = 208
Error = [Microsoft] [ODBC-Treiber 13 für SQL Server] [SQL Server] Ungültiger Objektname 'DBname.dbo.T ble_Name'.

Hinweis: Der Befehl funktioniert perfekt mit Tabellennamen ohne dieses Sonderzeichen ä.

Antworten:


7

Ich glaube, dass dies ein Codierungsproblem zwischen der Shell und bcp / SQL Server ist. SQL Server erwartet UTF-16 Little Endian, aber Linux verwendet das nicht. Die Standardeinstellung für meine Linux-VM ist UTF-8 über en_GB.UTF-8.

<TL; DR> Verwenden Sie den Befehl "queryout" bcp und geben Sie an, "SELECT * FROM ..."anstatt den Befehl "out" zu verwenden und einfach einen Tabellennamen anzugeben .

Was folgt ist meine Prüfung ...


Ich habe die Liste der verfügbaren Gebietsschemas / Codierungen erhalten mit:

$ locale -a

ist zurückgekommen:

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

Ich habe mehrere dieser Optionen ausprobiert, indem ich Folgendes eingestellt habe:

$ export LC_CTYPE=C.UTF-8

und dann erneut versuchen mit:

$ export LC_ALL=C.UTF-8

Nichts schien einen Unterschied zu machen. Und jedes Mal habe ich es mit verschiedenen Kombinationen von eckigen Klammern ohne -qund dann mit -qund dann ohne eckige Klammern mit und ohne versucht -q.

Ich habe sogar versucht, die Bytes zu injizieren, die dem UTF-16 LE-Zeichen von ävia $'\xe4\x00'und gerade entsprechen würden $'\xe4'$'\x00', aber keine Verbesserungen.

JEDOCH,

was taten Arbeit das änderte sich bcp von Befehl outstattdessen sein queryout, und dann den Tabellennamen zu ändern Teil eines sein SELECTStatement (ich die entfernt -r ~nur Schalter hier die Befehlszeile nicht horizontal scrollen zu machen, aber es war in meinen Tests). Ich habe die Tabelle erstellt [tempdb]und Folgendes ausgeführt:

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

Keine Probleme da. Interessanterweise habe ich den Akzent äin einen nicht akzentuierten geändert a:

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

und erhielt den folgenden Fehler:

SQLState = S1000, NativeError = 0
Error = [Microsoft] [ODBC-Treiber 13 für SQL Server] Kollatierungen auf Spaltenebene können nicht aufgelöst werden

Das ist ein Fehler von bcp und muss sich auf die Metadaten von beziehen, tempdbda die einzige Spalte in meiner Testtabelle den INTDatentyp verwendet.

Jetzt ist meine Sortierung auf Instanzebene akzentempfindlich, sodass ich nicht wirklich adamit gerechnet habe, dass die nicht akzentuierte Sortierung funktioniert (obwohl ich einen Fehler "Ungültiges Objekt" erwartet habe). Um die Akzentunempfindlichkeit zu testen, habe ich eine neue Datenbank mit einer Sortierung von Latin1_General_100_CI_AI_KS_WS_CSerstellt, dieselbe Tabelle in der neuen Datenbank erstellt und einige Zeilen hinzugefügt. Ich habe dann die folgenden zwei Tests durchgeführt:

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

und beide haben funktioniert!

Auf den ursprünglichen zurück bcp - Befehl nur die Angabe den Tabellennamen anstelle einer Abfrage, ich war in der Lage zu bekommen ImportTest.dbo.[Table_Name]und ImportTest.dbo.Table_Namean der Arbeit. Ich war jedoch immer noch nicht in der Lage, eine Kombination von ImportTest.dbo.[Täble_Name]zur Arbeit zu bringen; Alle Variationen haben die gleichen Fehler wie zuvor.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.