Laden von XML-Daten

Gilt für: SQL Server Azure SQL-Datenbank

XML-Daten können auf unterschiedliche Weise in SQL Server übertragen werden. Zum Beispiel:

  • Wenn sich die Daten in einer [n]text- oder image-Spalte einer SQL Server-Datenbank befinden, können Sie die Tabelle mithilfe von Integrationsdiensten importieren. Ändern Sie den Spaltentyp mithilfe der ALTER TABLE-Anweisung zu XML.

  • Sie können bcp out zum Massenkopieren Ihrer Daten aus einer anderen SQL Server-Datenbanken verwenden, um sie dann mit bcp in als Masseneinfügung in eine aktuellere Datenbankversion einzufügen.

  • Wenn Sie über Daten in relationalen Spalten in einer SQL Server-Datenbank verfügen, erstellen Sie eine neue Tabelle in einer [n]text-Spalte und optional eine Primärschlüsselspalte für einen Zeilenbezeichner. Rufen Sie mithilfe clientseitiger Programmierung den XML-Code ab, der mit FOR XML auf dem Server generiert wurde, und schreiben Sie ihn in die [n]text -Spalte. Verwenden Sie dann die oben erwähnten Techniken, um die Daten in eine höhere Version der Datenbank zu übertragen. Sie können den XML-Code auch direkt in eine XML-Spalte in der Datenbank der höheren Version schreiben.

Massenladen von XML-Daten

Sie können XML-Daten mit einem Massenladevorgang auf den Server laden, indem Sie die Massenladefunktionen von SQL Server verwenden, z. B. bcp. Mit OPENROWSET können Sie Daten aus Dateien in eine XML-Spalte laden. Das folgende Beispiel zeigt dieses Problem.

Beispiel: Laden von XML-Daten aus Dateien

Dieses Beispiel zeigt, wie eine Zeile in Tabelle T eingefügt wird. Der Wert der XML-Spalte wird aus der Datei C:\MyFile\xmlfile.xml als CLOB geladen, und die integer-Spalte erhält den Wert 10.

INSERT INTO T
SELECT 10, xCol
FROM    (SELECT *
    FROM OPENROWSET (BULK 'C:\MyFile\xmlfile.xml', SINGLE_BLOB)
AS xCol) AS R(xCol);

Textcodierung

SQL Server speichert XML-Daten im Unicode (UTF-16)-Format. Die vom Server abgerufenen XML-Daten liegen UTF-16-codiert vor. Wenn Sie eine andere Codierung wünschen, müssen Sie die erforderliche Konvertierung für die abgerufenen Daten ausführen. Manchmal können die XML-Daten in einer abweichenden Codierung vorliegen. Wenn das der Fall ist, müssen Sie beim Laden der Daten mit großer Sorgfalt vorgehen. Zum Beispiel:

  • Wenn Ihre Text-XML-Daten in Unicode (UCS-2, UTF-16) vorliegen, können Sie sie problemlos einer XML-Spalte, einer XML-Variablen oder einem XML-Parameter zuweisen.

  • Wenn die Codierung nicht Unicode ist und aufgrund der Quellcodeseite implizit ist, sollte die Zeichenfolgencodeseite in der Datenbank den Codepunkten gleichen oder mit den Codepunkten kompatibel sein, die Sie laden wollen. Verwenden Sie bei Bedarf COLLATE. Wenn keine solche Servercodeseite vorhanden ist, müssen Sie eine explizite XML-Deklaration mit der richtigen Codierung hinzufügen.

  • Verwenden Sie entweder den varbinary() -Typ, der keinerlei Interaktion mit Codeseiten aufweist, oder einen Zeichenfolgentyp der entsprechenden Codeseite, damit eine explizite Codierung verwendet wird. Weisen Sie anschließend die Daten einer XML-Spalte, einer XML-Variablen oder einem XML-Parameter zu.

Beispiel: Explizites Angeben einer Codierung

Angenommen, Sie besitzen das XML-Dokument „vcdoc“, das im Datentyp varchar(max) gespeichert ist und keine explizite XML-Deklaration aufweist. Mit der folgenden Anweisung wird eine XML-Deklaration mit der Codierung „iso8859-1“ hinzugefügt, das XML-Dokument verkettet, das Ergebnis in varbinary(max) umgewandelt, sodass die Bytedarstellung erhalten bleibt, und das Ergebnis schließlich in XML umgewandelt. Das ermöglicht es dem XML-Prozessor, die Daten entsprechend der angegebenen Codierung "iso8859-1" zu analysieren und die entsprechende UTF-16-Darstellung für Zeichenfolgenwerte zu generieren.

SELECT CAST(
CAST (('<?xml version="1.0" encoding="iso8859-1"?>'+ vcdoc) AS VARBINARY (MAX))
AS XML);

Inkompatibilitäten bei der Zeichenfolgencodierung

Wenn Sie XML als Zeichenfolgenliteral kopieren und in im Abfrage-Editor-Fenster in SQL Server Management Studio einfügen, stellen Sie ggf. Inkompatibilitäten bei [n]varchar-Zeichenfolgencodierungen fest. Dies hängt von der Codierung Ihrer XML-Instanz ab. In vielen Fällen möchten Sie die XML-Deklaration möglicherweise entfernen. Zum Beispiel:

<?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema ...

Anschließend sollten Sie der Zeichenfolge ein N als Präfix voranstellen, um die XML-Instanz zu einer Unicode-Instanz zu machen. Zum Beispiel:

-- Assign XML instance to a variable.
DECLARE @X XML
SET @X = N'...'
-- Insert XML instance into an xml type column.
INSERT INTO T VALUES (N'...')
-- Create an XML schema collection
CREATE XML SCHEMA COLLECTION XMLCOLL1 AS N'<xsd:schema ... '

Weitere Informationen