Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Der SQL Server 2008-Assistent zum Generieren von Skripts gibt mir ein Skript, das zu nicht geschlossenen Anführungszeichen führt

Lösung für das SQL Server-Importproblem

Vorbedingung

Um die Daten von einem SQL Server auf einen anderen zu verschieben (z. B. von der Produktionsumgebung in die Testumgebung), ist es sinnvoll, die Funktion „Skripts generieren“ zu verwenden, die in den Datenbankoptionen in SQL Server Management Studio verfügbar ist. Das Ergebnis dieser Operation ist eine Textdatei mit SQL-Befehlen, die auf einem anderen SQL-Server ausgeführt werden können. Normalerweise sind diese Dateien zu groß, um sie in SQL Server Management Studio auszuführen, daher müssen wir sqlcmd verwenden Befehlszeilendienstprogramm aus dem SQL Server-Installationspaket. In den meisten Fällen funktioniert das Dienstprogramm reibungslos und zusätzliche Benutzeraktionen sind nicht erforderlich.

Problembeschreibung

In einigen seltenen Fällen wird der sqlcmd Dienstprogramm kann beim Import fehlschlagen und den folgenden Fehler auslösen:"Nicht geschlossenes Anführungszeichen nach der Zeichenfolge ...", was darauf hinweist, dass eine der SQL-Abfragen nicht ausgeführt wurde. Dies geschieht, weil sqlcmd arbeitet mit Stream-Verarbeitung, d.h. es liest einige Daten, verarbeitet sie, liest das nächste Stück und so weiter. In einigen Fällen kann eine Eingabedatei riesige SQL-Anweisungen enthalten, deren Größe größer ist als die Datenmenge, die von sqlcmd verarbeitet werden könnte gleichzeitig, also sqlcmd versucht, fehlerhaftes SQL auszuführen und schlägt fehl.

Mögliche Lösungen

Um dieses Problem zu beheben, können 2 Ansätze verwendet werden:

  • Der sqlcmd Das Dienstprogramm kann den Parameter "-a" akzeptieren, der die maximale Größe des Pakets (Datenstücks) definiert, das während der Verarbeitung verwendet wird. Der Maximalwert ist 32767, der Standardwert ist 4096, daher ist es sinnvoll, diesen Parameter immer mit Maximalwert zu verwenden.

    sqlcmd -i input.sql -a 32767 -o import_log.txt
    
  • Wenn der erste Ansatz nicht geholfen hat und das Problem weiterhin auftritt, gibt es eine andere, schwierigere Lösung:

    • Installieren Sie Cygwin
      • Halten Sie während der Installation nach einigen Standardbildschirmen auf dem Bildschirm "Pakete auswählen"
      • an
      • Geben Sie im Feld "Suchen" "sed" ein und erweitern Sie in der Baumstruktur unten die Kategorie "Basis" und wählen Sie mindestens Version 4.2.2 für die Installation aus
      • Installation abschließen
      • Hinweis:"sed" ist das Linux-Dienstprogramm, das eine Stream-basierte Dateiverarbeitung ermöglicht
    • Führen Sie nach Abschluss der Installation "Cygwin64 Terminal" vom Desktop aus. Wir werden es für die nächsten Schritte verwenden
    • Wechseln Sie in das Verzeichnis, in dem sich die von SQL Server Management Studio generierte SQL-Datei befindet. Sie müssen Schrägstriche im Linux-Stil "/" anstelle des Windows-Stils verwenden, der "\"

      ist
        cd d:/temp
      
    • Ändern Sie die Codierung der SQL-Datei von UTF-16LE auf UTF-8, da "sed" UTF-16LE nicht verarbeiten kann, ist diese Konvertierung sicher für die Daten. Das Ergebnis wird eine neue Datei sein, die wir im nächsten Schritt verwenden werden

        iconv -f UTF-16LE -t UTF-8 input.sql > input_utf8.sql
      
    • Konvertieren Sie die neue Datei, um eine SQL-Abfrage in einem Stapel zu haben. Das Ergebnis wird eine neue Datei sein, die wir im nächsten Schritt verwenden werden

        sed -e 's/^INSERT/GO\nINSERT/' input_utf8.sql > input_utf8_adapted.sql
      
    • Jetzt sollte die Datei "input_utf8_adapted.sql" ohne Probleme von sqlcmd verarbeitet werden, sodass wir Folgendes ausführen können:

        sqlcmd -i input_utf8_adapted.sql -a 32767 -o import_log.txt
      
    • Nachdem die Ausführung abgeschlossen ist, überprüfen Sie bitte import_log.txt, um sicherzustellen, dass keine Fehler aufgetreten sind