OPENXML (SQL Server)OPENXML (SQL Server)

La parola chiave Transact-SQLTransact-SQL OPENXML restituisce un set di righe simile a una tabella o una vista da documenti XML in memoria.OPENXML, a Transact-SQLTransact-SQL keyword, provides a rowset over in-memory XML documents that is similar to a table or a view. OPENXML consente di accedere ai dati XML come se si trattasse di un set di righe relazionali,OPENXML allows access to XML data as though it is a relational rowset. visualizzando la rappresentazione interna di un documento XML come un set di righe.It does this by providing a rowset view of the internal representation of an XML document. I record del set di righe possono essere archiviati in tabelle di database.The records in the rowset can be stored in database tables.

È possibile usare OPENXML nelle istruzioni SELECT e SELECT INTO ogni volta che i provider di set di righe, una vista o OPENROWSET possono comparire come origine.OPENXML can be used in SELECT and SELECT INTO statements wherever rowset providers, a view, or OPENROWSET can appear as the source. Per informazioni sulla sintassi di OPENXML, vedere OPENXML (Transact-SQL).For information about the syntax of OPENXML, see OPENXML (Transact-SQL).

Per creare query da eseguire su un documento XML tramite OPENXML, è prima necessario chiamare sp_xml_preparedocument,To write queries against an XML document by using OPENXML, you must first call sp_xml_preparedocument. che analizza il documento XML e restituisce un handle al documento analizzato e pronto per l'utilizzo.This parses the XML document and returns a handle to the parsed document that is ready for consumption. Il documento analizzato è una rappresentazione dell'albero del modello a oggetti documento (DOM, Document Object Model) dei vari nodi inclusi nel documento XML.The parsed document is a document object model (DOM) tree representation of various nodes in the XML document. L'handle del documento viene quindi passato a OPENXML,The document handle is passed to OPENXML. che a sua volta visualizza il documento come un set di righe in base ai parametri passati.OPENXML then provides a rowset view of the document, based on the parameters passed to it.

Nota

sp_xml_preparedocument usa una versione aggiornata a SQL del parser MSXML, Msxmlsql.dll. sp_xml_preparedocument uses a SQL-updated version of the MSXML parser, Msxmlsql.dll. Questa versione è stata progettata per supportare SQL ServerSQL Server e garantire la compatibilità con MSXML versione 2.6.This version of the MSXML parser was designed to support SQL ServerSQL Server and remain backward compatible with MSXML version 2.6.

La rappresentazione interna di un documento XML deve essere rimossa dalla memoria tramite una chiamata alla stored procedure di sistema sp_xml_removedocument , in modo tale da liberare memoria.The internal representation of an XML document must be removed from memory by calling the sp_xml_removedocument system stored procedure to free the memory.

Nella figura seguente è illustrato questo processo.The following illustration shows the process.

Analisi XML con OPENXMLParsing XML with OPENXML

Si noti che per comprendere l'utilizzo di OPENXML, è necessario avere familiarità con le query XPath e XML.Note that to understand OPENXML, familiarity with XPath queries and an understanding of XML is required. Per altre informazioni sul supporto di XPath in SQL Server, vedere Utilizzo di query XPath in SQLXML 4.0.For more information about XPath support in SQL Server, see Using XPath Queries in SQLXML 4.0.

Nota

OpenXML consente di parametrizzare i modelli XPath di riga e colonna come le variabili.OpenXML allows the row and column XPath patterns to be parameterized as variables. La parametrizzazione può comportare attacchi intrusivi nelle espressioni XPath se viene esposta dal programmatore a utenti esterni, ad esempio se i parametri sono forniti tramite una stored procedure chiamata dall'esterno.Such parameterization could lead to XPath expression injections, if the programmer exposes the parameterization to outside users (for example, if the parameters are provided via an externally called stored procedure). Per evitare questi problemi potenziali di sicurezza, è consigliabile non esporre mai i parametri XPath a chiamanti esterni.To avoid such potential security issues, it is recommended that XPath parameters should never be exposed to external callers.

EsempioExample

Nell'esempio seguente viene illustrato l'utilizzo di OPENXML in un'istruzione INSERT e in un'istruzione SELECT .The following example shows the use of OPENXML in an INSERT statement and a SELECT statement. Il documento XML di esempio contiene gli elementi <Customers> e <Orders> .The sample XML document contains <Customers> and <Orders> elements.

La stored procedure sp_xml_preparedocument analizza innanzitutto il documento XML.First, the sp_xml_preparedocument stored procedure parses the XML document. Il documento analizzato corrisponde a una rappresentazione ad albero dei vari nodi (elementi, attributi, testo, commenti e così via) del documento XML.The parsed document is a tree representation of the nodes (elements, attributes, text, and comments) in the XML document. OPENXML si riferisce quindi al documento XML analizzato e fornisce una visualizzazione del set di righe di tutto o parte del documento.OPENXML then refers to this parsed XML document and provides a rowset view of all or parts of this XML document. Un'istruzione INSERT che usa OPENXML può inserire i dati di tale set di righe in una tabella di database.An INSERT statement using OPENXML can insert data from such a rowset into a database table. È possibile usare diverse chiamate a OPENXML per ottenere una vista del set di righe di diverse parti del documento XML ed elaborarle, ad esempio inserendole in tabelle diverse.Several OPENXML calls can be used to provide a rowset view of various parts of the XML document and process them, for example, by inserting them into different tables. Tale processo è noto anche come "suddivisione del documento XML in tabelle".This process is also referred to as shredding XML into tables.

Nell'esempio seguente un documento XML viene suddiviso in modo che gli elementi <Customers> vengano archiviati nella tabella Customers e gli elementi <Orders> vengano archiviati nella tabella Orders usando due istruzioni INSERT .In the following example, an XML document is shredded in a way that <Customers> elements are stored in the Customers table and <Orders> elements are stored in the Orders table by using two INSERT statements. Nell'esempio viene inoltre illustrata un'istruzione SELECT con la funzione OPENXML che recupera CustomerID e OrderDate dal documento XML.The example also shows a SELECT statement with OPENXML that retrieves CustomerID and OrderDate from the XML document. L'ultimo passaggio del processo consiste nel chiamare sp_xml_removedocumentThe last step in the process is to call sp_xml_removedocument. in modo da rilasciare la memoria allocata per includere la rappresentazione dell'albero XML interno creata durante la fase di analisi.This is done in order to release the memory allocated to contain the internal XML tree representation that was created during the parse phase.

-- Create tables for later population using OPENXML.  
CREATE TABLE Customers (CustomerID varchar(20) primary key,  
                ContactName varchar(20),   
                CompanyName varchar(20));  
GO  
CREATE TABLE Orders( CustomerID varchar(20), OrderDate datetime;)  
GO  
DECLARE @docHandle int;  
DECLARE @xmlDocument nvarchar(max); -- or xml type  
SET @xmlDocument = N'<ROOT>  
<Customers CustomerID="XYZAA" ContactName="Joe" CompanyName="Company1">  
<Orders CustomerID="XYZAA" OrderDate="2000-08-25T00:00:00"/>  
<Orders CustomerID="XYZAA" OrderDate="2000-10-03T00:00:00"/>  
</Customers>  
<Customers CustomerID="XYZBB" ContactName="Steve"  
CompanyName="Company2">No Orders yet!  
</Customers>  
</ROOT>';  
EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument;  
-- Use OPENXML to provide rowset consisting of customer data.  
INSERT Customers   
SELECT *   
FROM OPENXML(@docHandle, N'/ROOT/Customers')   
  WITH Customers;  
-- Use OPENXML to provide rowset consisting of order data.  
INSERT Orders   
SELECT *   
FROM OPENXML(@docHandle, N'//Orders')   
  WITH Orders;  
-- Using OPENXML in a SELECT statement.  
SELECT * FROM OPENXML(@docHandle, N'/ROOT/Customers/Orders') WITH (CustomerID nchar(5) '../@CustomerID', OrderDate datetime);  
-- Remove the internal representation of the XML document.  
EXEC sp_xml_removedocument @docHandle;   

Nella figura seguente viene illustrato l'albero XML analizzato del documento XML precedente creato tramite sp_xml_preparedocument.The following illustration shows the parsed XML tree of the previous XML document that was created by using sp_xml_preparedocument.

Albero XML analizzatoParsed XML tree

Parametri di OPENXMLOPENXML Parameters

I parametri passati a OPENXML includono:The parameters to OPENXML include the following:

  • L'handle di un documento XML (idoc)An XML document handle (idoc)

  • Un'espressione XPath che identifica i nodi di cui eseguire il mapping alle righe (rowpattern)An XPath expression to identify the nodes to be mapped to rows (rowpattern)

  • Una descrizione del set di righe da generare.A description of the rowset to be generated

  • Il mapping tra le colonne del set di righe e i nodi XML.Mapping between the rowset columns and the XML nodes

Handle del documento XML (idoc)XML Document Handle (idoc)

L'handle del documento viene restituito dalla stored procedure sp_xml_preparedocumentThe document handle is returned by the sp_xml_preparedocument stored procedure.

Espressione XPath che identifica i nodi da elaborare (rowpattern)XPath Expression to Identify the Nodes to Be Processed (rowpattern)

L'espressione XPath specificata come rowpattern identifica un set di nodi nel documento XML.The XPath expression specified as rowpattern identifies a set of nodes in the XML document. Ogni nodo definito da rowpattern corrisponde a una riga specifica del set di righe generato da OPENXML.Each node that is identified by rowpattern corresponds to a single row in the rowset that is generated by OPENXML.

I nodi definiti dall'espressione XPath possono essere qualsiasi nodo XML del documento XML.The nodes identified by the XPath expression can be any XML node in the XML document. Se rowpattern identifica un set di elementi nel documento XML, a ogni nodo identificato corrisponderà una riga nel set di righe.If rowpattern identifies a set of elements in the XML document, there is one row in the rowset for each element node identified. Ad esempio, se rowpattern restituisce un attributo, verrà creata una riga per ogni nodo attributo selezionato da rowpattern.For example, if rowpattern ends in an attribute, a row is created for each attribute node selected by rowpattern.

Descrizione del set di righe da generareDescription of the Rowset to Be Generated

OPENXML usa uno schema di set di righe per generare il set di righe risultante.A rowset schema is used by OPENXML to generate the resulting rowset. Per specificare uno schema di set di righe, è possibile usare le opzioni illustrate di seguito.You can use the following options when specifying a rowset schema.

Utilizzo del formato di tabella edgeUsing the Edge Table Format

Per specificare uno schema di set di righe è consigliabile usare il formato di tabella edge,You should use the edge table format to specify a rowset schema. evitando invece di usare la clausola WITH.Do not use the WITH clause.

In questo caso, OPENXML restituisce un set di righe nel formato di tabella edge.When you do this, OPENXML returns a rowset in the edge table format. Il nome di questo formato deriva dal fatto che su ogni margine dell'albero del documento XML analizzato viene eseguito il mapping a una riga del set di righe.This is referred to as an edge table, because every edge in the parsed XML document tree maps to a row in the rowset.

In una tabella edge viene rappresentata la struttura dettagliata di un documento XML,Edge tables represent within a single table the fine-grained XML document structure. che include i nomi degli elementi e degli attributi, la gerarchia del documento, gli spazi dei nomi e le istruzioni per l'elaborazione.This structure includes the element and attribute names, the document hierarchy, the namespaces, and the processing instructions. Il formato di tabella edge consente di ottenere informazioni aggiuntive non esposte tramite le metaproprietà.The edge table format allows you to obtain additional information that is not exposed through the metaproperties. Per altre informazioni sulle metaproprietà, vedere Specify Metaproperties in OPENXML.For more information about metaproperties, see Specify Metaproperties in OPENXML.

Le informazioni aggiuntive disponibili in una tabella edge consentono di archiviare e di eseguire query sul tipo di dati di un elemento o di un attributo e sul tipo di nodo, di archiviare ed eseguire query sulle informazioni relative alla struttura del documento XML,The additional information provided by an edge table allows you to store and query the data type of an element and attribute, and the node type, and also store and query information about the XML document structure. nonché di compilare un sistema di gestione dei documenti XML personalizzato.With this additional information, it may also be possible to build your own XML document management system.

Tramite una tabella edge è possibile scrivere stored procedure che accettano i documenti XML come input BLOB (Binary Large Object), generano la tabella edge e quindi estraggono e analizzano il documento al massimo livello di dettaglioBy using an edge table, you can write stored procedures that take XML documents as binary large object (BLOB) input, produce the edge table, and then extract and analyze the document on a more detailed level. (ricerca della gerarchia del documento, dei nomi di elementi e attributi, degli spazi dei nomi e delle istruzioni per l'elaborazione).This detailed level could include finding the document hierarchy, the element and attribute names, the namespaces, and the processing instructions.

La tabella edge può inoltre fungere da formato di archiviazione per i documenti XML quando nessun altro tipo di mapping ad altri formati relazionali risulta appropriato e un campo ntext non restituisce informazioni strutturali sufficienti.The edge table also can serve as a storage format for XML documents when mapping to other relational formats is not logical and an ntext field is not providing enough structural information.

L'utilizzo di una tabella edge per analizzare un documento XML equivale a usare un parser XML per ottenere le stesse informazioni.In situations where you can use an XML parser to examine an XML document, you can use an edge table instead to obtain the same information.

Nella tabella seguente viene descritta la struttura della tabella edge.The following table describes the structure of the edge table.

Nome colonnaColumn name Tipo di datiData type DescrizioneDescription
idid bigintbigint ID univoco del nodo del documento.Is the unique ID of the document node.

Il valore dell'ID dell'elemento radice è 0.The root element has an ID value of 0. I valori di ID negativi sono riservati.The negative ID values are reserved.
parentidparentid bigintbigint Identifica il padre del nodo.Identifies the parent of the node. Il padre identificato da questo ID non è necessariamente l'elemento padre,The parent identified by this ID is not necessarily the parent element. ma dipende dalla proprietà NodeType del nodo il cui padre è identificato da questo ID.However, this depends on the NodeType of the node whose parent is identified by this ID. Se ad esempio il nodo è di tipo testo, il relativo elemento padre potrebbe essere un nodo attributo.For example, if the node is a text node, its parent may be an attribute node.

Se il nodo si trova al livello principale nel documento XML, il relativo valore ParentID è NULL.If the node is at the top level in the XML document, its ParentID is NULL.
node typenode type intint Identifica il tipo di nodo ed è un intero che corrisponde alla numerazione del tipo di nodo DOM XML.Identifies the node type and is an integer that corresponds to the XML object model (DOM) node type numbering.

Di seguito sono riportati i valori che indicano il tipo di nodo visualizzabili nella colonna:Following are the values that can appear in this column to indicate the node type:

1 = Nodo elemento1 = Element node

2 = Nodo attributo2 = Attribute node

3 = Nodo di testo3 = Text node

4 = Nodo sezione CDATA4 = CDATA section node

5 = Nodo riferimento a entità5 = Entity reference node

6 = Nodo entità6 = Entity node

7 = Nodo istruzione di elaborazione7 = Processing instruction node

8 = Nodo di commento8 = Comment node

9 = Nodo di documento9 = Document node

10 = Nodo tipo di documento10 = Document Type node

11 = Nodo frammento di documento11 = Document Fragment node

12 = Nodo di notazione12 = Notation node

Per altre informazioni, vedere l'argomento relativo alla proprietà nodeType nella documentazione di Microsoft XML (MSXML) SDK.For more information, see the "nodeType Property" topic in the Microsoft XML (MSXML) SDK.
localnamelocalname nvarchar(max)nvarchar(max) Nome locale dell'elemento o attributo.Gives the local name of the element or attribute. È NULL se l'oggetto DOM non è associato a un nome.Is NULL if the DOM object does not have a name.
prefixprefix nvarchar(max)nvarchar(max) Prefisso dello spazio dei nomi del nome del nodo.Is the namespace prefix of the node name.
namespaceurinamespaceuri nvarchar(max)nvarchar(max) URI dello spazio dei nomi del nodo.Is the namespace URI of the node. Se il valore è NULL, non sono presenti spazi dei nomi.If the value is NULL, no namespace is present.
datatypedatatype nvarchar(max)nvarchar(max) Rappresenta il tipo di dati effettivo della riga dell'elemento o dell'attributo e in caso contrario è NULL.Is the actual data type of the element or attribute row and is otherwise NULL. Il tipo di dati viene ricavato dalla DTD o dallo schema inline.The data type is inferred from the inline DTD or from the inline schema.
prevprev bigintbigint ID XML dell'elemento di pari livello precedente.Is the XML ID of the previous sibling element. È NULL se non è presente alcun elemento diretto di pari livello precedente.Is NULL if there is no direct previous sibling.
texttext ntextntext Include il valore dell'attributo o il contenuto dell'elemento in formato testoContains the attribute value or the element content in text form. oppure è NULL se la voce della tabella edge non richiede un valore.Or is NULL, if the edge table entry does not need a value.

Utilizzo della clausola WITH per specificare una tabella esistenteUsing the WITH Clause to Specify an Existing Table

È possibile usare la clausola WITH per specificare il nome di una tabella esistente.You can use the WITH clause to specify the name of an existing table. A tale scopo, specificare il nome della tabella il cui schema può essere usato da OPENXML per generare il set di righe.To do this, just specify an existing table name whose schema can be used by OPENXML to generate the rowset.

Utilizzo della clausola WITH per specificare uno schemaUsing the WITH Clause to Specify a Schema

È possibile usare la clausola WITH per specificare uno schema completo.You can use the WITH Clause to specify a complete schema. Quando si specifica lo schema del set di righe, si definiscono i nomi delle colonne e i rispettivi tipi di dati, nonché il mapping di tali colonne al documento XML.In specifying the rowset schema, you specify the column names, their data types, and their mapping to the XML document.

È possibile specificare il modello di colonna usando il parametro ColPattern nell'argomento SchemaDeclaration.You can specify the column pattern by using the ColPattern parameter in the SchemaDeclaration. Il modello di colonna specificato consente di eseguire il mapping di una colonna del set di righe al nodo XML identificato da rowpattern, nonché di determinare il tipo di mapping.The specified column pattern is used to map a rowset column to the XML node that is identified by rowpattern and is also used to determine the type of mapping.

Se per una colonna non viene specificato il parametro ColPattern, viene eseguito il mapping della colonna del set di righe al nodo XML con lo stesso nome, in base al mapping specificato dal parametro flags .If ColPattern is not specified for a column, the rowset column maps to the XML node with the same name, based on the mapping specified by the flags parameter. Se viene impostato nell'ambito della specifica dello schema nella clausola WITH, il parametro ColPattern sarà tuttavia prioritario rispetto al mapping specificato dal parametro flags .However, if ColPattern is specified as part of the schema specification in the WITH clause, it overwrites the mapping that is specified in the flags parameter.

Il mapping tra le colonne del set di righe e i nodi XML.Mapping Between the Rowset Columns and the XML Nodes

Nell'istruzione OPENXML è anche possibile specificare facoltativamente il tipo di mapping (incentrato sugli attributi o sugli elementi) tra le colonne del set di righe e i nodi XML identificati da rowpattern.In the OPENXML statement, you can optionally specify the type of mapping, such as attribute-centric or element-centric, between the rowset columns and the XML nodes that are identified by the rowpattern. Questa informazione viene usata per la trasformazione tra i nodi XML e le colonne del set di righe.This information is used in the transformation between the XML nodes and the rowset columns.

Per specificare il tipo di mapping è possibile procedere in due modi e inoltre usare entrambi i sistemi:You can specify the mapping in two ways, and you can also specify both:

  • Tramite il parametro flags .By using the flags parameter

    Il mapping specificato dal parametro flags si basa sullo corrispondenza dei nomi, ovvero sui nodi XML viene eseguito il mapping alle colonne del set di righe corrispondenti con lo stesso nome.The mapping that is specified by the flags parameter assumes name correspondence in which the XML nodes map to the corresponding rowset columns with same name.

  • Tramite il parametro ColPattern .By using the ColPattern parameter

    Il parametroColPattern, ovvero un'espressione XPath, viene specificato nell'ambito di SchemaDeclaration nella clausola WITH.ColPattern, an XPath expression, is specified as part of SchemaDeclaration in the WITH clause. Il mapping specificato dal parametro ColPattern sovrascrive il mapping specificato dal parametro flags .The mapping specified in ColPattern overwrites the mapping specified by the flags parameter.

    Il parametroColPattern consente di specificare il tipo di mapping, incentrato sugli attributi o sugli elementi, che sovrascrive o migliora il mapping predefinito indicato in flags.ColPattern can be used to specify the type of mapping, such as attribute-centric or element-centric, that overwrites or enhances the default mapping indicated by the flags.

    Il parametroColPattern viene specificato nei casi seguenti:ColPattern is specified under the following circumstances:

    • Se il nome di colonna nel set di righe è diverso dal nome dell'elemento o dell'attributo al quale viene eseguito il mapping.The column name in the rowset is different from the element or attribute name to which it is mapped. In questo caso, il parametro ColPattern consente di identificare il nome dell'elemento o dell'attributo XML al quale viene eseguito il mapping della colonna del set di righe.In this case, ColPattern is used to identify the XML element and attribute name to which the rowset column maps.

    • Se si desidera eseguire il mapping di un attributo di una metaproprietà alla colonna.You want to map a metaproperty attribute to the column. In questo caso, il parametro ColPattern consente di definire la metaproprietà alla quale viene eseguito il mapping della colonna del set di righe.In this case, ColPattern is used to identify the metaproperty to which the rowset column maps. Per altre informazioni su come usare le metaproprietà, vedere Impostazione di metaproprietà in OPENXML.For more information about how to use metaproperties, see Specify Metaproperties in OPENXML.

    I parametri flags e ColPattern sono entrambi facoltativi.Both the flags and ColPattern parameters are optional. Se non viene specificato un mapping, viene usato il mapping incentrato sugli attributi,If no mapping is specified, attribute-centric mapping is assumed. ovvero il valore predefinito del parametro flags .Attribute-centric mapping is the default value of the flags parameter.

mapping incentrato sugli attributiAttribute-centric Mapping

Se il parametro flags dell'istruzione OPENXML viene impostato su 1 (XML_ATTRIBUTES), viene definito un mapping incentrato sugli attributi .Setting the flags parameter in OPENXML to 1 (XML_ATTRIBUTES) specifies attribute-centric mapping. Se il parametro flags include XML_ ATTRIBUTES, il set di righe esposto restituisce o usa le righe nelle quali ogni elemento XML è rappresentato come una riga.If flags contains XML_ ATTRIBUTES, the exposed rowset provides or consumes rows where each XML element is represented as a row. Sugli attributi XML viene eseguito il mapping agli attributi definiti in SchemaDeclaration o restituiti da Tablename nella clausola WITH, in base alla corrispondenza dei nomi.The XML attributes are mapped to the attributes that are defined in the SchemaDeclaration or that are provided by the Tablename of the WITH clause, based on name correspondence. La corrispondenza dei nomi indica che gli attributi XML con un nome specifico vengono archiviati in una colonna del set di righe con lo stesso nome.Name correspondence means that the XML attributes of a particular name are stored in a column in the rowset with the same name.

Se il nome della colonna è diverso dal nome dell'attributo a cui viene eseguito il mapping della colonna, è necessario specificare il parametro ColPattern .If the column name is different from the attribute name that it maps to, ColPattern must be specified.

Se l'attributo XML è associato a un qualificatore dello spazio dei nomi, anche il nome della colonna del set di righe deve essere associato a un qualificatore.If the XML attribute has a namespace qualifier, the column name in the rowset must also have the qualifier.

Mapping incentrato sugli elementiElement-centric Mapping

Se il parametro flags dell'istruzione OPENXML viene impostato su 2 (XML_ELEMENTS), viene definito un mapping incentrato sugli elementi .Setting the flags parameter in OPENXML to 2 (XML_ELEMENTS) specifies element-centric mapping. Pur essendo simile al mapping incentrato sugli attributi , questo tipo di mapping è caratterizzato dalle differenze seguenti:It is similar to attribute-centric mapping, except for the following differences:

  • In base alla corrispondenza dei nomi del mapping, ad esempio una colonna su cui viene eseguito il mapping a un elemento XML avente lo stesso nome, verranno selezionati i sottoelementi non complessi a meno che non venga specificato un modello dei livelli delle colonne.The name correspondence of the mapping example, a column mapping to an XML element with the same name chooses the noncomplex subelements, unless a column-level pattern is specified. Nella fase di recupero dei dati, se il sottoelemento è complesso perché include altri sottoelementi, la colonna verrà impostata su NULLIn the retrieval process, if the subelement is complex because it contains additional subelements, the column is set to NULL. e i valori degli attributi dei sottoelementi verranno ignorati.Attribute values of the subelements are then ignored.

  • Nel caso di più sottoelementi con lo stesso nome, verrà restituito il primo nodo.For multiple subelements that have the same name, the first node is returned.

Vedere ancheSee Also

sp_xml_preparedocument (Transact-SQL) sp_xml_preparedocument (Transact-SQL)
sp_xml_removedocument (Transact-SQL) sp_xml_removedocument (Transact-SQL)
OPENXML (Transact-SQL) OPENXML (Transact-SQL)
Dati XML (SQL Server) XML Data (SQL Server)