Schemasyntax für XML-Formatdateien

In diesem Abschnitt wird die Syntax von XML-Formatdateien beschrieben. Unter Beispiele für XML-Formatdateien können Sie die Syntax mit tatsächlichen XML-Formatdateien vergleichen. Darüber hinaus wird in diesem Abschnitt dargestellt, wie <ROW>- und <COLUMN>-Elemente beim Massenimportieren verwendet werden und wie der xsi:type-Wert eines Elements in ein Dataset eingefügt wird.

Eine XML-Formatdatei kann mit dem Befehl bcp, einer BULK INSERT-Anweisung oder einer INSERT ... SELECT * FROM OPENROWSET(BULK...)-Anweisung verwendet werden.

HinweisHinweis

   Sie können eine Formatdatei so ändern, dass Sie einen Massenimport von einer Datendatei durchführen können, in der die Anzahl und/oder Reihenfolge der Felder von der Anzahl und/oder Reihenfolge der Tabellenspalten abweicht. Weitere Informationen finden Sie unter Verwenden einer Formatdatei zum Zuordnen von Feldern zu Spalten während des Massenimports.

Basissyntax des XML-Schemas

Diese Syntaxanweisungen zeigen nur die Elemente (<BCPFORMAT>, <RECORD>, <FIELD>, <ROW> und <COLUMN>) und deren grundlegende Attribute an.

<BCPFORMAT ...>

   <RECORD>

      <FIELD ID = "fieldID" xsi:type = "fieldType" [...]

      />

   </RECORD>

   <ROW>

      <COLUMN SOURCE = "fieldID" NAME = "columnName" xsi:type = "columnType" [...]

      />

   </ROW>

</BCPFORMAT>

HinweisHinweis

Zusätzliche Attribute, die mit dem Wert von xsi:type in einem <FIELD>- oder <COLUMN>-Element verknüpft sind, werden weiter unten in diesem Thema beschrieben.

Beschreibung der Schemaelemente

In diesem Abschnitt werden die Funktionen aller Elemente dargestellt, die das XML-Schema für XML-Formatdateien definiert. Die Attribute werden in separaten Abschnitten weiter unten in diesem Thema beschrieben.

  • <BCPFORMAT>
    Ist das Element der Formatdatei, das die Datensatzstruktur einer bestimmten Datendatei und ihre Übereinstimmung mit den Spalten einer Tabellenzeile in einer Tabelle definiert.

  • <RECORD .../>
    Definiert ein komplexes Element, das ein oder mehrere <FIELD>-Elemente enthält. Die Reihenfolge, in der die Felder in der Formatdatei deklariert werden, entspricht der Reihenfolge, in der diese Felder in der Datendatei angezeigt werden.

  • <FIELD .../>
    Definiert ein Feld in der Datendatei, das Daten enthält.

    Die Attribute dieses Elements werden unter "Attribute des <FIELD>-Elements" weiter unten in diesem Thema beschrieben.

  • <ROW .../>
    Definiert ein komplexes Element, das ein oder mehrere <COLUMN>-Elemente enthält. Die Reihenfolge der <COLUMN>-Elemente ist unabhängig von der Reihenfolge der <FIELD>-Elemente in einer RECORD-Definition. Stattdessen bestimmt die Reihenfolge der <COLUMN>-Elemente in einer Formatdatei die Reihenfolge der Spalten im zurückgegebenen Rowset. Die Datenfelder werden in der Reihenfolge geladen, in der die entsprechenden <COLUMN>-Elemente im <COLUMN>-Element deklariert werden.

    Weitere Informationen finden Sie unter "Verwenden des <ROW>-Elements beim Massenimportieren" weiter unten in diesem Thema.

  • <COLUMN>
    Definiert eine Spalte als ein Element (<COLUMN>). Jedes <COLUMN>-Element entspricht einem <FIELD>-Element (dessen ID im SOURCE-Attribut des <COLUMN>-Elements angegeben ist).

    Die Attribute dieses Elements werden unter "Attribute des <COLUMN>-Elements" weiter unten in diesem Thema beschrieben. Informationen finden Sie außerdem unter "Verwenden des <COLUMN>-Elements beim Massenimportieren" weiter unten in diesem Thema.

  • </BCPFORMAT>
    Ist erforderlich, um die Formatdatei zu beenden.

Attribute des <FIELD>-Elements

In diesem Abschnitt werden die Attribute des <FIELD>-Elements beschrieben, die in der folgenden Schemasyntax zusammengefasst sind:

<FIELD

   ID ="fieldID"

   xsi**:**type ="fieldType"

   [ LENGTH ="n" ]

   [ PREFIX_LENGTH ="p" ]

   [ MAX_LENGTH ="m" ]

   [ COLLATION ="collationName" ]

   [ TERMINATOR ="terminator" ]

/>

Alle <FIELD>-Elemente sind unabhängig voneinander. Ein Feld wird anhand der folgenden Attribute beschrieben:

FIELD-Attribut

Beschreibung

Optional /

Erforderlich

ID ="fieldID"

Gibt den logischen Namen des Felds in der Datendatei an. Die ID eines Felds ist der Schlüssel, mit dem auf das Feld verwiesen wird.

<FIELD ID="fieldID"/> wird zugeordnet zu <COLUMN SOURCE="fieldID"/>

Erforderlich

xsi:type ="fieldType"

Dies ist ein (als Attribut verwendetes) XML-Konstrukt, das den Typ der Instanz des Elements identifiziert. Der Wert für fieldType bestimmt, welche der optionalen Attribute (unten) in einer bestimmten Instanz erforderlich sind.

Erforderlich (abhängig vom Datentyp)

LENGTH ="n"

Dieses Attribut definiert die Länge für eine Instanz mit einem Datentyp fester Länge.

Der Wert von n muss eine positive ganze Zahl sein.

Optional, sofern nicht für den xsi:type-Wert erforderlich

PREFIX_LENGTH ="p"

Dieses Attribut definiert die Präfixlänge für eine binäre Datendarstellung. Bei dem PREFIX_LENGTH-Wert p muss es sich um eine der folgenden Zahlen handeln: 1, 2, 4 oder 8.

Optional, sofern nicht für den xsi:type-Wert erforderlich

MAX_LENGTH ="m"

Dieses Attribut gibt die maximale Anzahl an Byte an, die in einem bestimmten Feld gespeichert werden kann. Ohne eine Zieltabelle ist die maximale Spaltenlänge nicht bekannt. Das MAX_LENGTH-Attribut beschränkt die maximale Länge einer Ausgabezeichenspalte sowie den Speicherplatz, der dem Spaltenwert zugewiesen ist. Dies ist vor allem bei Verwendung der BULK-Option der OPENROWSET-Funktion in einer SELECT FROM-Klausel nützlich.

Der Wert von m muss eine positive ganze Zahl sein. Standardmäßig beträgt die maximale Länge 8000 Zeichen für eine char-Spalte und 4000 Zeichen für eine nchar-Spalte.

Optional

COLLATION ="collationName"

COLLATION ist nur für Zeichenfelder zulässig. Eine Liste der SQL-Sortierungsnamen finden Sie unter SQL Server-Sortierungsname (Transact-SQL).

Optional

TERMINATOR = "terminator"

Dieses Attribut gibt das Abschlusszeichen eines Datenfelds an. Als Abschlusszeichen kann jedes beliebige Zeichen verwendet werden. Es muss sich jedoch um ein eindeutiges Zeichen handeln, das nicht Teil der Daten ist.

Standardmäßig wird das Tabstoppzeichen (dargestellt als \t) als Abschlusszeichen verwendet. Um eine Absatzmarke darzustellen, verwenden Sie \r\n.

Wird nur mit einem xsi:type von Zeichendaten verwendet, die dieses Attribut erfordern.

Xsi:type-Werte des <FIELD>-Elements

Der xsi:type-Wert ist ein (als Attribut verwendetes) XML-Konstrukt, das den Datentyp für eine Instanz eines Elements identifiziert. Weitere Informationen finden Sie unter "Einfügen des xsi:type-Werts in ein Dataset" weiter unten in diesem Abschnitt.

Der xsi:type-Wert des <FIELD>-Elements unterstützt die folgenden Datentypen.

xsi:type-Werte für <FIELD>

Erforderliche(s) XML-Attribut(e)

für Datentyp

Optionale(s) XML-Attribut(e)

für Datentyp

NativeFixed

LENGTH

Keine.

NativePrefix

PREFIX_LENGTH

MAX_LENGTH

CharFixed

LENGTH

COLLATION

NCharFixed

LENGTH

COLLATION

CharPrefix

PREFIX_LENGTH

MAX_LENGTH, COLLATION

NCharPrefix

PREFIX_LENGTH

MAX_LENGTH, COLLATION

CharTerm

TERMINATOR

MAX_LENGTH, COLLATION

NCharTerm

TERMINATOR

MAX_LENGTH, COLLATION

Weitere Informationen zu Microsoft SQL Server-Datentypen finden Sie unter Datentypen (Transact-SQL).

Attribute des <COLUMN>-Elements

In diesem Abschnitt werden die Attribute des <COLUMN>-Elements beschrieben, die in der folgenden Schemasyntax zusammengefasst sind:

<COLUMN

   SOURCE = "fieldID"

   NAME = "columnName"

   xsi:type = "columnType"

   [ LENGTH = "n" ]

   [ PRECISION = "n" ]

   [ SCALE = "value" ]

   [ NULLABLE = { "YES"

"NO" } ]

/>

Ein Feld wird mithilfe der folgenden Attribute einer Spalte in der Zieltabelle zugeordnet:

COLUMN-Attribut

Beschreibung

Optional /

Erforderlich

SOURCE ="fieldID"

Gibt die ID des Felds an, das der Spalte zugeordnet wird.

<COLUMN SOURCE="fieldID"/> wird zugeordnet zu <FIELD ID="fieldID"/>

Erforderlich

NAME = "columnName"

Gibt den Namen der Spalte im Rowset an, die durch die Formatdatei dargestellt wird. Dieser Spaltenname wird verwendet, um die Spalte im Resultset zu identifizieren; er muss nicht dem in der Zieltabelle verwendeten Spaltennamen entsprechen.

Erforderlich

xsi:type ="ColumnType"

Dies ist ein (als Attribut verwendetes) XML-Konstrukt, das den Datentyp der Instanz des Elements identifiziert. Der Wert für ColumnType bestimmt, welche der optionalen Attribute (unten) in einer bestimmten Instanz erforderlich sind.

HinweisHinweis
Mögliche Werte für ColumnType sowie die zugehörigen Attribute werden in der folgenden Tabelle aufgelistet.

Optional

LENGTH ="n"

Definiert die Länge für eine Instanz mit einem Datentyp fester Länge. LENGTH wird nur verwendet, wenn es sich bei xsi:type um einen Zeichenfolgen-Datentyp handelt.

Der Wert von n muss eine positive ganze Zahl sein.

Optional (nur verfügbar, wenn xsi:type ein Zeichenfolgen-Datentyp ist)

PRECISION ="n"

Gibt die Anzahl der Stellen einer Zahl an. Beispielsweise hat die Zahl 123,45 eine Genauigkeit von 5.

Der Wert muss eine positive ganze Zahl sein.

Optional (nur verfügbar, wenn xsi:type ein Datentyp mit variablen Zahlen ist)

SCALE ="int"

Gibt die Anzahl der Stellen rechts vom Dezimaltrennzeichen einer Zahl an. Beispielsweise verfügt die Zahl 123,45 über 2 Dezimalstellen.

Der Wert muss eine ganze Zahl sein.

Optional (nur verfügbar, wenn xsi:type ein Datentyp mit variablen Zahlen ist)

NULLABLE = { "YES"

"NO" }

Gibt an, ob eine Spalte NULL-Werte verarbeiten kann. Dieses Attribut ist unabhängig von FIELDS. Falls die Spalte jedoch nicht NULLABLE ist und für ein Feld NULL (d. h. kein Wert) angegeben wurde, tritt ein Laufzeitfehler auf.

Das NULLABLE-Attribut wird nur verwendet, wenn Sie eine einfache SELECT FROM OPENROWSET (BULK...)-Anweisung ausführen.

Optional (verfügbar für jeden beliebigen Datentyp)

Xsi:type-Werte des <COLUMN>-Elements

Der xsi:type-Wert ist ein (als Attribut verwendetes) XML-Konstrukt, das den Datentyp für eine Instanz eines Elements identifiziert. Weitere Informationen finden Sie unter "Einfügen des xsi:type-Werts in ein Dataset" weiter unten in diesem Abschnitt.

Das <COLUMN>-Element unterstützt systemeigene SQL-Datentypen wie folgt:

Typkategorie

<COLUMN>-Datentypen

Erforderliche(s) XML-Attribut(e)

für Datentyp

Optionale(s) XML-Attribut(e)

für Datentyp

Fest

SQLBIT, SQLTINYINT, SQLSMALLINT, SQLINT, SQLBIGINT, SQLFLT4, SQLFLT8, SQLDATETIME, SQLDATETIM4, SQLDATETIM8, SQLMONEY, SQLMONEY4, SQLVARIANT und SQLUNIQUEID

Keine.

NULLABLE

Variable Zahl

SQLDECIMAL und SQLNUMERIC

Keine.

NULLABLE, PRECISION, SCALE

LOB

SQLIMAGE, CharLOB, SQLTEXT und SQLUDT

Keine.

NULLABLE

Character LOB

SQLNTEXT

Keine.

NULLABLE

Binäre Zeichenfolge

SQLBINARY und SQLVARYBIN

Keine.

NULLABLE, LENGTH

Zeichenfolge

SQLCHAR, SQLVARYCHAR, SQLNCHAR und SQLNVARCHAR

Keine.

NULLABLE, LENGTH

Wichtiger HinweisWichtig

Verwenden Sie in Ihrer Formatdatei einen der folgenden Datentypen, um einen Massenexport oder -import von SQLXML-Daten auszuführen: SQLCHAR oder SQLVARYCHAR (die Daten werden in der Clientcodepage oder in der Codepage, die durch die Sortierung impliziert wird, gesendet), SQLNCHAR oder SQLNVARCHAR (die Daten werden als Unicode gesendet) oder SQLBINARY oder SQLVARYBIN (die Daten werden ohne Konvertierung gesendet).

Weitere Informationen zu SQL Server-Datentypen finden Sie unter Datentypen (Transact-SQL).

Verwenden des &lt;ROW&gt;-Elements beim Massenimportieren

Das <ROW->-Element wird in bestimmten Kontexten ignoriert. Ob sich das <ROW>-Element auf einen Massenimportvorgang auswirkt, hängt davon ab, wie der Vorgang durchgeführt wird:

  • Der Befehl bcp

    Wenn Daten in eine Zieltabelle geladen werden, ignoriert bcp die <ROW>-Komponente. Stattdessen lädt bcp die Daten auf der Grundlage der Spaltentypen der Zieltabelle.

  • Transact-SQL-Anweisungen (BULK INSERT und der OPENROWSET-Massenrowsetanbieter)

    Beim Massenimportieren von Daten in eine Tabelle verwenden Transact-SQL-Anweisungen die <ROW>-Komponente, um das Eingaberowset zu generieren. Darüber hinaus führen Transact-SQL-Anweisungen auf der Grundlage der unter <ROW> angegebenen Spaltentypen und der entsprechenden Spalte in der Zieltabelle die erforderlichen Typkonvertierungen durch. Besteht eine Nichtübereinstimmung zwischen den Spaltentypen, die in der Formatdatei und in der Zieltabelle angegeben sind, wird eine zusätzliche Typkonvertierung durchgeführt. Aufgrund dieser zusätzlichen Typkonvertierung kann es zu einer Diskrepanz (d. h. einem Genauigkeitsverlust) im Verhalten von BULK INSERT bzw. des OPENROWSET-Massenrowsetanbieters verglichen mit bcp kommen.

    Anhand der Informationen im <ROW>-Element kann eine Zeile erstellt werden, ohne dass zusätzliche Informationen erforderlich sind. Aus diesem Grund können Sie ein Rowset mithilfe einer SELECT-Anweisung generieren (SELECT * FROM OPENROWSET(BULK datafile FORMATFILE=xmlformatfile).

    HinweisHinweis

    Die OPENROWSET BULK-Klausel erfordert eine Formatdatei (beachten Sie, dass eine Konvertierung vom Datentyp des Felds in den Datentyp der Spalte nur mit einer XML-Formatdatei möglich ist).

Verwenden des &lt;COLUMN&gt;-Elements beim Massenimportieren

Um einen Massenimport von Daten in eine Tabelle durchzuführen, ordnen die <COLUMN>-Elemente in einer Formatdatei den Tabellenspalten ein Datendateifeld zu, indem sie folgende Angaben machen:

  • Die Position jedes Felds innerhalb einer Zeile in der Datendatei.

  • Der Spaltentyp, der verwendet wird, um den Felddatentyp in den gewünschten Spaltendatentyp zu konvertieren.

Falls einem Feld keine Spalte zugeordnet ist, wird das Feld nicht in die generierte(n) Zeile(n) kopiert. Dieses Verhalten ermöglicht, dass eine Datendatei Zeilen mit unterschiedlichen Spalten (in verschiedenen Tabellen) generieren kann.

Entsprechend ordnet beim Massenexportieren von Daten aus einer Tabelle jedes <COLUMN>-Element in der Formatdatei die Spalte aus der Eingabetabellenzeile dem entsprechenden Feld in der Ausgabedatendatei zu.

Einfügen des xsi:type-Werts in ein Dataset

Wird ein XML-Dokument durch die XSD-Sprache (XML Schema Definition) überprüft, wird der xsi:type-Wert nicht in das Dataset eingefügt. Sie können die xsi:type-Informationen jedoch in das Dataset einfügen, indem Sie die XML-Formatdatei in ein XML-Dokument laden (z. B. myDoc), wie durch den folgenden Codeausschnitt veranschaulicht:

...;
myDoc.LoadXml(xmlFormat);
XmlNodeList ColumnList = myDoc.GetElementsByTagName("COLUMN");
for(int i=0;i<ColumnList.Count;i++)
{
   Console.Write("COLUMN: xsi:type=" +ColumnList[i].Attributes["type",
      "http://www.w3.org/2001/XMLSchema-instance"].Value+"\n");
}