Der Befehl SQLCMD kann keine Akzente einfügen

19

Ich versuche, sqlcmd.exe auszuführen, um eine neue Datenbank über die Befehlszeile einzurichten . Ich verwende SQL Server Express 2012 unter Windows 7 64-Bit.

Hier ist der Befehl, den ich benutze:

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log 

Und hier ist ein Teil des Skripts zur Erstellung von SQL-Dateien:

    CREATE DATABASE aqualogy 
    COLLATE Modern_Spanish_CI_AS
    WITH TRUSTWORTHY ON, DB_CHAINING ON;
    GO
    use aqualogy
    GO
    CREATE TABLE [dbo].[BaseLayers] (
    [Code] nchar(100) NOT NULL ,
    [Geometry] nvarchar(MAX) NOT NULL ,
    [IsActive] bit NOT NULL DEFAULT ((1)) 
    )

    EXEC sp_updateextendedproperty @name = N'MS_Description', @value = N'Capas de     cartografía base de la aplicaicón. Consideramos en Galia Móvil la cartografía(...)'
, @level0type = 'SCHEMA', @level0name = N'dbo'
, @level1type = 'TABLE', @level1name = N'BaseLayers'

Bitte überprüfen Sie, ob die Wörter Akzente enthalten. Das ist die Beschreibung der Tabelle. Die Datenbank wird ohne Probleme erstellt. 'Sortieren' wird vom Skript verstanden, wie Sie im angehängten Screenshot sehen können. Trotzdem werden die Akzente beim Untersuchen der Tabelle nicht richtig angezeigt.Sortierproblem

Ich würde jede Hilfe wirklich schätzen. Vielen Dank.

[Bearbeiten]: Hallo zusammen. Das Ändern der SQL-Dateicodierung mit Notepad ++ hat problemlos funktioniert! Vielen Dank für Ihre Hilfe: Ich habe mit diesem Problem etwas Interessantes gelernt!

Bildbeschreibung hier eingeben

Oskytar
quelle
1
Wie lautet die Codierung Ihrer SQL-Skriptdatei?
Teichleben
Ich würde mit @ Pondlife Idee gehen. Besorgen Sie sich einen Texteditor (z. B. Notepad ++), öffnen Sie dort die SQL-Datei, gehen Sie zu Encoding und stellen Sie sicher, dass Ihre Datei nicht in ANSI (oder einer anderen nicht unterstützten Codierung) vorliegt. Wenn dies der Fall ist, konvertieren Sie die Datei in eine andere Datei. Ich würde sagen, UTF8 sollte es tun. Lassen Sie uns wissen, wie es gelaufen ist.
Marian

Antworten:

7

Wie aus den Kommentaren hervorgeht, liegt das Problem nicht genau bei der Tabelle oder der Art und Weise, wie SQLCMD die Sonderzeichen importiert. In der Regel hängen problematische Importe mit dem Format des Skripts selbst zusammen.

Management Studio selbst bietet die Möglichkeit, mit einer bestimmten Codierung zu speichern, um das Problem in Zukunft zu lösen. Wenn Sie eine Datei zum ersten Mal speichern (oder Speichern unter verwenden), klicken Sie auf den kleinen Pfeil neben der Schaltfläche Speichern , um die Option Mit Codierung speichern zu verwenden .

Bildbeschreibung hier eingeben

Standardmäßig wird die Datei in Westeuropa (1252) gespeichert . Wann immer ich Sonderzeichen habe, verwende ich UTF8 (obwohl vielleicht eine andere einschränkende Kodierung passen würde), weil es normalerweise die schnellste Lösung ist.

Bildbeschreibung hier eingeben

Ich bin mir nicht sicher (siehe Bild), ob Sie SSMS verwenden. Stellen Sie daher sicher, dass Ihr eigener Editor die Option hat, die Datei in einer anderen Codierung zu speichern. Wenn nicht, funktioniert das Konvertieren der Datei in einem intelligenten Editor (wie Sie es bereits in Notepad ++ versucht haben) normalerweise. Dies funktioniert jedoch möglicherweise nicht, wenn Sie von einer breiten Codierung zu einer schmaleren und dann zurück zu einer breiten Codierung konvertieren (z. B. von Unicode zu ANSI und zurück zu Unicode).

Marian
quelle
Hallo Marian. Danke nochmal. Ich habe die 'Data Transfer'-Funktion von Navicat verwendet, weil mir die Art und Weise gefällt, wie das SQL-Skript generiert wird (schnell, unabhängig von Mdf-Dateien und seitdem immer für mich funktioniert). Ich habe einige Parameter in der Funktion "Datenübertragung" bei Navicat überprüft, aber ich habe keine Möglichkeit gefunden, die Codierung der Ausgabedatei zu ändern. Ich muss mit Notepad ++ etwas mehr arbeiten, um die Codierung zu ändern, aber das ist keine große Sache.
Oskytar
Gut, kein Problem. In der Regel werden Danksagungen auf dieser Website mithilfe der Funktion "Upvote" (Aufwärtspfeil neben der Antwort) übermittelt, wenn die Antwort hilfreich ist, oder, wenn das Problem vollständig behoben ist, sogar mithilfe der Option "Markieren als Antwort" (Häkchen neben der Antwort) ) :-). Weitere Informationen finden Sie hier in den FAQ .
Marian
Ich korrigiere meinen letzten Kommentar: ES IST MÖGLICH, die Dateiausgabecodierung zu wählen, wenn 'Datenübertragung' mit Navicat ausgeführt wird.
Oskytar
Cool, so dass Sie jetzt den manuellen Konvertierungsschritt umgehen können. Das ist sogar noch besser.
Marian
2
Diese Antwort scheint nicht richtig zu sein. Ich hatte eine mit Notepad ++ in UTF-8 gespeicherte Datei. SQLCMD.exe überträgt die Zeichen nicht korrekt. Wenn ich den Inhalt auf SSMS kopiere, funktioniert es einwandfrei. Die wirkliche Lösung war die Antwort von swasheck, um param -f 65001 hinzuzufügen.
Tomas Kubes
38

Eine andere Option, die ich gerade gelernt habe, stammt aus der sqlcmdDokumentation . Sie müssen die Codepage so einstellen sqlcmd, dass sie mit der der Dateicodierung übereinstimmt. Im Fall von UTF-8 lautet die Codepage 65001, Sie möchten also:

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001

Swasheck
quelle
1
Das hat mir gerade das Leben gerettet. Ich wollte gerade ein Powershell-Skript erstellen, um eine CSV-Datei mit der UTF8-Kodierung import-csv zu lesen. Thanks
Spörri
Dies funktionierte für mich, als ich irische Textwerte mit Fadas (á, é, í, ó, ú) in eine NVARCHAR-Spalte
einfügen musste
Dies ist die richtige Antwort
Pitchmatt
2

Diese Art von Dingen ist sehr knifflig, weil so viel getan wird, ohne es dir zu sagen.

Als erstes würde ich sqlcmd verwenden, um die Zeichenfolge anzuzeigen. Wenn es im Fenster cmd.exe richtig angezeigt wird, ist dies eine nützliche Tatsache. Als nächstes wähle ich die Zeile aus, in der convertder String varbinary ist, um zu sehen, welche Bytes tatsächlich vorhanden sind. Ich denke, cartografía wird als 0x636172746f67726166c3ad61angezeigt, wo das akzentuierte "i" durch die Bytes c3ad dargestellt wird, die die UTF-8-Codierung für dieses Zeichen ist. Es ist nicht gut, UTF-8 in einer modernen spanischen Spalte zu haben (Windows 1252). Der Bytewert in Windows 1252 für dieses Zeichen ist 237 Dezimal (hexadezimal ED).

Wenn die Spalte falsch codierte Daten enthält, liegt der Fehler darin, wie sie eingefügt wurden. Wenn Sie möglicherweise das führende N in den Zeichenfolgenkonstanten entfernen N'string', um SQL Server anzuweisen, eine Unicode-Zeichenfolge zu generieren, aber einfach 'string'anzugeben, dass die Zeichen die Client-Codierung verwenden, wird statt Unicode modernes Spanisch eingefügt.

Wenn die Spalte korrekt codierte Daten enthält, haben Sie einen Fehler in der GUI-Anzeige gefunden.

Wenn Sie sqlcmd nicht dazu bringen können, die Daten korrekt einzufügen (führendes N oder nicht), möchten Sie sich bei Microsoft beschweren. Wenn Sie dies tun, ist es wichtig, dass Sie die in der Spalte gespeicherten Bytes mithilfe von convert(colname as varbinary)anzeigen können, um zu erklären, was falsch läuft.

James K. Lowden
quelle
Hallo James, vielen Dank für deine ausführliche Antwort. Ich habe einige Tests durchgeführt und Sqlcmd.exe zeigt nicht die richtige Zeichenfolge an. Es ist eindeutig ein Problem, wie Daten eingefügt werden.
Oskytar
Mit SQL Profiler habe ich debuggt, welche Sätze an SQL Server gesendet wurden, wenn der SQL Server-GUI-Client verwendet wurde. INSERT IN [ElementType] ([Code], [Name], [Beschreibung], [GeometryType], [stringId], [CapturedGeometryType]) VALUES ('ESTACION', 'Estación', 'Estación', 'Multipoint', NULL, 'Punkt'); funktionierte gut, so dass alle Akzente richtig eingefügt wurden !. Das ist derselbe 'Einfügungssatz', der in meinem SQL-Skript erscheint. Soll ich den Zeichencode in der SQL-Skriptdatei angeben?
Oskytar