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 -q
und dann mit -q
und 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 out
stattdessen sein queryout
, und dann den Tabellennamen zu ändern Teil eines sein SELECT
Statement (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, tempdb
da die einzige Spalte in meiner Testtabelle den INT
Datentyp verwendet.
Jetzt ist meine Sortierung auf Instanzebene akzentempfindlich, sodass ich nicht wirklich a
damit 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_CS
erstellt, 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_Name
an 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.