Erstellen von Instanzen der XML-DatenCreate Instances of XML Data

In diesem Thema wird beschrieben, wie XML-Instanzen generiert werden.This topic describes how to generate XML instances.

In SQL ServerSQL Servergibt es folgende Möglichkeiten, XML-Instanzen zu generieren:In SQL ServerSQL Server, you can generate XML instances in the following ways:

  • Typumwandlung von ZeichenfolgeninstanzenType casting string instances.

  • Verwenden der SELECT-Anweisung mit der FOR XML-KlauselUsing the SELECT statement with the FOR XML clause.

  • Verwenden von KonstantenzuweisungenUsing constant assignments.

  • Verwenden von MassenladenUsing bulk load.

Typumwandlung von Zeichenfolgen und BinärinstanzenType Casting String and Binary Instances

Sie können alle Zeichenfolgen-Datentypen von SQL ServerSQL Server , z.B. [n][var]char, [n]text, varbinaryund image, im xml -Datentyp analysieren, indem Sie die Zeichenfolge in den xml -Datentyp umwandeln (CAST) oder konvertieren (CONVERT).You can parse any of the SQL ServerSQL Server string data types, such as [n][var]char, [n]text, varbinary,and image, into the xml data type by casting (CAST) or converting (CONVERT) the string to the xml data type. Nicht typisiertes XML wird überprüft, um die Wohlgeformtheit zu bestätigen.Untyped XML is checked to confirm that it is well formed. Wenn dem xml -Datentyp ein Schema zugeordnet ist, wird ebenfalls eine Überprüfung ausgeführt.If there is a schema associated with the xml type, validation is also performed. Weitere Informationen finden Sie unter Vergleichen von typisiertem XML mit nicht typisiertem XML.For more information, see Compare Typed XML to Untyped XML.

XML-Dokumente können unterschiedlich codiert werden (z. B.: UTF-8, UTF-16, Windows-1252).XML documents can be encoded with different encodings (for example, UTF-8, UTF-16, windows-1252). Im Folgenden werden die Regeln erläutert, nach denen Zeichenfolgen- und Binärtypen mit der Codierung des XML-Dokuments interagieren und die das Verhalten des Parsers steuern.The following outlines the rules on how the string and binary source types interact with the XML document encoding and how the parser behaves.

Da nvarchar eine Doppelbyte-Unicode-Codierung wie UTF-16 oder UCS-2 annimmt, behandelt der XML-Parser den Zeichenfolgenwert als Doppelbyte-Unicode-codiertes XML-Dokument oder -Fragment.Since nvarchar assumes a two-byte unicode encoding such as UTF-16 or UCS-2, the XML parser will treat the string value as a two-byte Unicode encoded XML document or fragment. Dies bedeutet, dass auch das XML-Dokument in Doppelbyte-Unicode codiert sein muss, um mit dem Quelldatentyp kompatibel zu sein.This means that the XML document needs to be encoded in a two-byte Unicode encoding as well to be compatible with the source data type. Ein UTF-16-codiertes XML-Dokument kann eine UTF-16-Bytereihenfolgemarke (BOM, Byte Order Mark) besitzen, benötigt diese aber nicht, da der Kontext des Quelltyps deutlich macht, dass es sich nur um ein Doppelbyte-Unicode-Dokument handeln kann.A UTF-16 encoded XML document can have a UTF-16 byte order mark (BOM), but it does not need to, since the context of the source type makes it clear that it can only be a two-byte Unicode encoded document.

Der Inhalt einer varchar -Zeichenfolge wird vom XML-Parser als Einzelbyte-XML-Dokument/-Fragment behandelt.The content of a varchar string is treated as a one-byte encoded XML document/fragment by the XML parser. Da der Quellzeichenfolge varchar eine Codepage zugeordnet ist, verwendet der Parser diese Codepage für die Codierung, wenn im XML-Code keine explizite Codierung angegeben ist. Wenn eine XML-Instanz eine BOM- oder eine Codierungsdeklaration besitzt, muss diese zur Codepage passen. Andernfalls gibt der Parser einen Fehler aus.Since the varchar source string has a code page associated, the parser will use that code page for the encoding if no explicit encoding is specified in the XML itself If an XML instance has a BOM or an encoding declaration, the BOM or declaration needs to be consistent with the code page, otherwise the parser will report an error.

Der Inhalt von varbinary wird als Codepointdatenstrom behandelt, der direkt an den XML-Parser übergeben wird.The content of varbinary is treated as a codepoint stream that is passed directly to the XML parser. Daher muss das XML-Dokument oder -Fragment die BOM- oder eine andere Codierungsangabe inline enthalten.Thus, the XML document or fragment needs to provide the BOM or other encoding information inline. Der Parser bestimmt die Codierung ausschließlich anhand des Datenstroms.The parser will only look at the stream to determine the encoding. Dies bedeutet, dass UTF-16-codiertes XML die UTF-16-BOM enthalten muss, und dass eine Instanz ohne BOM und ohne Deklaration als UTF-8 interpretiert wird.This means that UTF-16 encoded XML needs to provide the UTF-16 BOM and an instance without BOM and without a declaration encoding will be interpreted as UTF-8.

Wenn die Codierung des XML-Dokuments im Vorfeld nicht bekannt ist und die Daten vor der Konvertierung in XML als Zeichenfolgen- oder als Binärdaten übergeben werden, sollten die Daten als varbinarybehandelt werden.If the encoding of the XML document is not known in advance and the data is passed as string or binary data instead of XML data before casting to XML, it is recommended to treat the data as varbinary. Wenn z.B. Daten aus einer XML-Datei mit OpenRowset() gelesen werden, sollten die zu lesenden Daten als varbinary(max) -Wert festgelegt sein:For example, when reading data from an XML file using OpenRowset(), one should specify the data to be read as a varbinary(max) value:

select CAST(x as XML)   
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x)  

SQL ServerSQL Server stellt XML intern in einer effizienten Binärdarstellung dar, die UTF-16-Codierung verwendet. internally represents XML in an efficient binary representation that uses UTF-16 encoding. Vom Benutzer bereitgestellte Codierung wird nicht beibehalten, während des Analysevorgangs jedoch berücksichtigt.User-provided encoding is not preserved, but is considered during the parse process.

Typumwandlung benutzerdefinierter CLR-TypenType Casting CLR user-defined types

Wenn ein benutzerdefinierter CLR-Typ eine XML-Serialisierung besitzt, können Instanzen dieses Typs explizit in einen XML-Datentyp umgewandelt werden.If a CLR user-defined type has an XML Serialization, instances of that type can be explicitly cast to an XML datatype. Weitere Einzelheiten zur XML-Serialisierung von benutzerdefinierten CLR-Typen finden Sie unter XML-Serialisierung auf Grundlage von CLR-Datenbankobjekten.For more details about the XML serialization of a CLR user-defined typed, see XML Serialization from CLR Database Objects.

Leerzeichenbehandlung in typisiertem XMLWhite Space Handling in Typed XML

In SQL ServerSQL Server werden Leerzeichen in Elementinhalten als unbedeutend betrachtet, wenn diese in einer Sequenz von Nur-Leerzeichen-Zeichendaten auftreten, die durch ein Markup wie z. B. Begin- oder End-Tags getrennt und nicht in Entitäten geändert werden.In SQL ServerSQL Server, white space inside element content is considered insignificant if it occurs inside a sequence of white-space-only character data delimited by markup, such as begin or end tags, and is not entitized. (CDATA-Abschnitte werden ignoriert). Diese Behandlung von Leerzeichen unterscheidet sich von der Beschreibung von Leerzeichen in der XML 1.0-Spezifikation, die vom W3C (World Wide Web Consortium) veröffentlicht wird.(CDATA sections are ignored.) This handling of white space handling is different from how white space is described in the XML 1.0 specification published by the World Wide Web Consortium (W3C). Die Ursache ist darin zu suchen, dass der XML-Parser in SQL ServerSQL Server nur eine beschränkte Anzahl der in XML 1.0 definierten DTD-Teilmengen erkennt.This is because the XML parser in SQL ServerSQL Server recognizes only a limited number of DTD subsets, as defined in XML 1.0. Weitere Informationen zu den beschränkten DTD-Teilmengen, die in SQL ServerSQL Server unterstützt werden, finden Sie unter CAST und CONVERT (Transact-SQL).For more information about the limited DTD subsets supported in SQL ServerSQL Server, see CAST and CONVERT (Transact-SQL).

Standardmäßig verwirft der XML-Parser insignifikante Leerzeichen, wenn Zeichenfolgendaten in XML konvertiert werden, wenn eine der folgenden Bedingungen zutrifft:By default, the XML parser discards insignificant white space when it converts string data to XML if either of the following is true:

  • The xml:space -Attribut ist nicht für ein Element oder seine Vorgängerelemente definiert.The xml:space attribute is not defined on an element or its ancestor elements.

  • Das xml:space -Attribut für ein Element oder eines seiner Vorgängerelemente weist den Standardwert auf.The xml:space attribute in effect on an element, or one of its ancestor elements, has the value of default.

    Beispiel:For example:

declare @x xml  
set @x = '<root>      <child/>     </root>'  
select @x   

Dies ist das Ergebnis:This is the result:

<root><child/></root>  

Sie können dieses Verhalten jedoch ändern.However, you can change this behavior. Um Leerzeichen für eine xml DT-Instanz beizubehalten, verwenden Sie den CONVERT-Operator und seinen optionalen style -Parameter, um einen Wert von 1 festzulegen.To preserve white space for an xml DT instance, use the CONVERT operator and its optional style parameter set to a value of 1. Beispiel:For example:

SELECT CONVERT(xml, N'<root>      <child/>     </root>', 1)  

Wenn der style -Parameter nicht verwendet oder sein Wert auf 0 festgelegt wird, werden insignifikante Leerzeichen für die Konvertierung der xml DT-Instanz nicht beibehalten.If the style parameter is either not used or its value is set to 0, insignificant white space is not preserved for the conversion of the xml DT instance. Weitere Informationen zum Verwenden des CONVERT-Operators und seines style-Parameters beim Konvertieren von Zeichenfolgendaten in XML DT-Instanzen finden Sie unter CAST und CONVERT (Transact-SQL).For more information about how to use the CONVERT operator and its style parameter when converting string data to xml DT instances, see CAST and CONVERT (Transact-SQL).

Beispiel: Umwandeln eines Zeichenfolgenwertes in typisiertes XML und Zuweisen des Wertes zu einer SpalteExample: Cast a string value to typed xml and assign it to a column

Das folgende Beispiel wandelt eine Zeichenfolgenvariable, die ein XML-Fragment enthält, in den xml -Datentyp um und speichert diesen dann in der Spalte vom Typ xml :The following example casts a string variable that contains an XML fragment to the xml data type and then stores it in the xml type column:

CREATE TABLE T(c1 int primary key, c2 xml)  
go  
DECLARE  @s varchar(100)  
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'   

Der folgende insert-Vorgang wandelt eine Zeichenfolge implizit in den xml -Typ um:The following insert operation implicitly converts from a string to the xml type:

INSERT INTO T VALUES (3, @s)   

Mithilfe von cast() können Sie die Zeichenfolge explizit in den xml -Datentyp umwandeln:You can explicitly cast() the string to the xml type:

INSERT INTO T VALUES (3, cast (@s as xml))  

Sie können auch convert() wie im folgenden Beispiel gezeigt verwenden:Or you can use convert(), as shown in the following:

INSERT INTO T VALUES (3, convert (xml, @s))   

Beispiel: Konvertieren einer Zeichenfolge in typisiertes XML und Zuweisen der Zeichenfolge zu einer SpalteExample: Convert a string to typed xml and assign it to a variable

Im folgenden Beispiel wird eine Zeichenfolge in den xml -Typ konvertiert und dann einer Variablen des xml -Datentyps zugewiesen.In the following example, a string is converted to xml type and assigned to a variable of the xml data type:

declare @x xml  
declare  @s varchar(100)  
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'   
set @x =convert (xml, @s)  
select @x  

Verwenden der SELECT-Anweisung mit einer FOR XML-KlauselUsing the SELECT Statement with a FOR XML Clause

Sie können die FOR XML-Klausel in einer SELECT-Anweisung verwenden, um Ergebnisse als XML zurückzugeben.You can use the FOR XML clause in a SELECT statement to return results as XML. Beispiel:For example:

DECLARE @xmlDoc xml  
SET @xmlDoc = (SELECT Column1, Column2  
               FROM   Table1, Table2  
               WHERE   Some condition  
               FOR XML AUTO)  
 ...  

Die SELECT-Anweisung gibt ein XML-Textfragment zurück, das dann während der Zuweisung zur Variablen des xml -Datentyps analysiert wird.The SELECT statement returns a textual XML fragment that is then parsed during the assignment to the xml data type variable.

Sie können auch die TYPE-Direktive in der FOR XML-Klausel verwenden, die direkt ein FOR XML-Abfrageergebnis als xml -Datentyp zurückgibt:You can also use the TYPE directive in the FOR XML clause that directly returns a FOR XML query result as xml type:

Declare @xmlDoc xml  
SET @xmlDoc = (SELECT ProductModelID, Name  
               FROM   Production.ProductModel  
               WHERE  ProductModelID=19  
               FOR XML AUTO, TYPE)  
SELECT @xmlDoc  

Dies ist das Ergebnis:This is the result:

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...  

Im folgenden Beispiel wird das typisierte xml -Ergebnis einer FOR XML-Abfrage in eine Spalte vom Typ xml eingefügt:In the following example, the typed xml result of a FOR XML query is inserted into an xml type column:

CREATE TABLE T1 (c1 int, c2 xml)  
go  
INSERT T1(c1, c2)  
SELECT 1, (SELECT ProductModelID, Name  
           FROM Production.ProductModel  
           WHERE ProductModelID=19  
           FOR XML AUTO, TYPE)  
SELECT * FROM T1  
go  

Weitere Informationen zu FOR XML finden Sie unter FOR XML (SQL Server).For more information about FOR XML, see FOR XML (SQL Server).

Hinweis

SQL ServerSQL Server werden xml -Datentypinstanzen an den Client zurückgegeben, die das Ergebnis unterschiedlicher Serverkonstrukte sind (z. B. FOR XML-Abfragen, für die die TYPE-Direktive verwendet wird, oder bei denen der xml -Datentyp verwendet wird, um XML aus SQL-Spalten, -Variablen und -Ausgabeparametern zurückzugeben). SQL ServerSQL Server returns xml data type instances to the client as a result of different server constructs such as FOR XML queries that use the TYPE directive, or where the xml data type is used to return XML from SQL columns, variables, and output parameters. Im Clientanwendungscode wird vom ADO.NET-Anbieter angefordert, dass diese xml -Datentypinformationen als Binärcode vom Server gesendet werden.In client application code, the ADO.NET provider requests that this xml data type information be sent in a binary encoding from the server. Wenn Sie FOR XML jedoch ohne die TYPE-Direktive verwenden, werden die XML-Daten als Zeichenfolgentyp zurückgegeben.However, if you are using FOR XML without the TYPE directive, the XML data returns as a string type. Der Clientanbieter ist in jedem Fall fähig, beide XML-Formate zu verarbeiten.In any case, the client provider will always be able to handle either form of XML.

Verwenden von KonstantenzuweisungenUsing Constant Assignments

Eine Zeichenfolgenkonstante kann dort verwendet werden, wo eine Instanz des xml -Datentyps erwartet wird.A string constant can be used where an instance of the xml data type is expected. Dies entspricht einer impliziten CAST-Anweisung für die Zeichenfolge in XML.This is the same as an implied CAST of string to XML. Beispiel:For example:

DECLARE @xmlDoc xml  
SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>'   
-- Or  
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>'  

Im vorherigen Beispiel wurde die Zeichenfolge implizit in den xml -Datentyp konvertiert und dann einer Variablen des xml -Datentyps zugewiesen.The previous example implicitly converts the string to the xml data type and assigns it to an xml type variable.

Das folgende Beispiel fügt eine Konstantenzeichenfolge in eine Spalte vom Typ xml ein:The following example inserts a constant string into an xml type column:

CREATE TABLE T(c1 int primary key, c2 xml)  
INSERT INTO T VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>')   
Hinweis

Für typisiertes XML wird das XML für das angegebene Schema überprüft.For typed XML, the XML is validated against the specified schema. Weitere Informationen finden Sie unter Vergleichen von typisiertem XML mit nicht typisiertem XML.For more information, see Compare Typed XML to Untyped XML.

Verwenden von MassenkopierenUsing Bulk Load

Die verbesserten OPENROWSET (Transact-SQL) -Funktionen ermöglichen das Massenkopieren von XML-Dokumenten in der Datenbank.The enhanced OPENROWSET (Transact-SQL) functionality allows you to bulk load XML documents in the database. Sie können XML-Instanzen aus Dateien in Spalten vom Typ xml in der Datenbank mit einem Massenkopiervorgang kopieren.You can bulk load XML instances from files into the xml type columns in the database. Funktionierende Beispiele finden Sie unter Beispiele für den Massenimport und -export von XML-Dokumenten (SQL Server).For working samples, see Examples of Bulk Import and Export of XML Documents (SQL Server). Weitere Informationen über das Laden von XML-Dokumenten finden Sie unter Laden von XML-Daten.For more information about loading XML documents, see Load XML Data.

In diesem AbschnittIn This Section

ThemaTopic BeschreibungDescription
Abrufen und Abfragen von XML-DatenRetrieve and Query XML Data Beschreibt die Teile von XML-Instanzen, die nicht beibehalten werden, wenn sie in Datenbanken gespeichert werden.Describes the parts of XML instances that are not preserved when they are stored in databases.

Siehe auchSee Also

Vergleichen von typisiertem XML mit nicht typisiertem XML Compare Typed XML to Untyped XML
xml-Datentypmethoden xml Data Type Methods
XML DML (Data Modification Language) XML Data Modification Language (XML DML)
XML-Daten (SQL Server) XML Data (SQL Server)