Utilizzare i metodi value() e nodes() con OPENXMLUse the value() and nodes() Methods with OPENXML

È possibile usare più metodi value() su un tipo di dati xml in una clausola SELECT per generare un set di righe di valori estratti.You can use multiple value() methods on xml data type in a SELECT clause to generate a rowset of extracted values. Il metodo nodes() crea un riferimento interno per ogni nodo selezionato, che può essere usato per altre query.The nodes() method yields an internal reference for each selected node that can be used for additional query. Se sono presenti numerose colonne e quando per la creazione del set di righe vengono usate espressioni di percorso complesse, si può usare una combinazione dei metodi nodes() e value() per generare il set di righe in modo più efficiente.The combination of the nodes() and value() methods can be more efficient in generating the rowset when it has several columns and, perhaps, when the path expressions used in its generation are complex.

Il metodo nodes() crea istanze di uno speciale tipo di dati xml, ognuna delle quali ha il contesto impostato su un nodo selezionato diverso.The nodes() method yields instances of a special xml data type, each of which has its context set to a different selected node. Questo tipo di istanza XML supporta i metodi query(), value(), nodes() e exist() e può essere usato nelle aggregazioni count(*).This kind of XML instance supports query(), value(), nodes(), and exist() methods and can be used in count(*) aggregations. Tutti gli altri utilizzi generano un errore.All other uses cause an error.

Esempio: utilizzo del metodo nodes()Example: Using nodes()

Si supponga di voler estrarre il nome e il cognome degli autori il cui nome è diverso da "David".Assume that you want to extract the first and last names of authors, and the first name is not "David". Si supponga inoltre di voler estrarre tali informazioni sotto forma di un set di righe contenente due colonne, FirstName e LastName.Additionally, you want to extract this information as a rowset that contains two columns, FirstName and LastName. A questo scopo si possono usare i metodi nodes() e value() , come mostrato nell'esempio seguente:By using nodes() and value() methods, you can accomplish this as shown in the following:

SELECT nref.value('(first-name/text())[1]', 'nvarchar(50)') FirstName,  
       nref.value('(last-name/text())[1]', 'nvarchar(50)') LastName  
FROM   T CROSS APPLY xCol.nodes('//author') AS R(nref)  
WHERE  nref.exist('first-name[. != "David"]') = 1  

In questo esempio nodes('//author') crea un set di righe di riferimenti agli elementi <author> per ogni istanza XML.In this example, nodes('//author') yields a rowset of references to <author> elements for each XML instance. I nomi e cognomi degli autori vengono ottenuti valutando i metodi value() in relazione a quei riferimenti.The first and last names of authors are obtained by evaluating value() methods relative to those references.

SQL Server 2000 consente di generare un set di righe da un'istanza XML usando OpenXml().SQL Server 2000 provides the capability for generating a rowset from an XML instance by using OpenXml(). È possibile specificare lo schema relazionale del set di righe e il mapping tra i valori presenti nell'istanza XML e le colonne nel set di righe.You can specify the relational schema for the rowset and how values inside the XML instance map to columns in the rowset.

Esempio: utilizzo di OpenXml() sul tipo di dati xmlExample: Using OpenXml() on the xml Data Type

È possibile riscrivere la query dell'esempio precedente usando OpenXml() come mostrato nell'esempio seguente.The query can be rewritten from the previous example by using OpenXml() as shown in the following. A tale scopo viene creato un cursore che legge ogni istanza XML in una variabile XML e quindi applica OpenXML alla variabile:This is done by creating a cursor that reads each XML instance into an XML variable and then applies OpenXML to it:

DECLARE name_cursor CURSOR  
FOR  
   SELECT xCol   
   FROM   T  
OPEN name_cursor  
DECLARE @xmlVal XML  
DECLARE @idoc int  
FETCH NEXT FROM name_cursor INTO @xmlVal  

WHILE (@@FETCH_STATUS = 0)  
BEGIN  
   EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlVal  
   SELECT   *  
   FROM   OPENXML (@idoc, '//author')  
          WITH (FirstName  varchar(50) 'first-name',  
                LastName   varchar(50) 'last-name') R  
   WHERE  R.FirstName != 'David'  

   EXEC sp_xml_removedocument @idoc  
   FETCH NEXT FROM name_cursor INTO @xmlVal  
END  
CLOSE name_cursor  
DEALLOCATE name_cursor   

OpenXml() crea una rappresentazione in memoria e usa tabelle di lavoro anziché Query Processor.OpenXml() creates an in-memory representation and uses work tables instead of the query processor. Si basa inoltre sul processore XPath versione 1.0 di MSXML versione 3.0, piuttosto che sul motore XQuery.It relies on the XPath version 1.0 processor of MSXML version 3.0 instead of the XQuery engine. Le tabelle di lavoro non vengono condivise tra più chiamate a OpenXml()nemmeno sulla stessa istanza XML.The work tables are not shared among multiple calls to OpenXml(), even on the same XML instance. Questo limita la scalabilità del metodo.This limits its scalability. OpenXml consente di accedere a un formato di tabella edge per i dati XML quando non è specificata la clausola WITHOpenXml() allows you to access an edge table format for the XML data when the WITH clause is not specified. e di utilizzare il valore XML rimanente in una colonna di "overflow" separata.Also, it allows you to use the remaining XML value in a separate, "overflow" column.

La combinazione di funzioni nodes() e value() consente di usare gli indici XML in modo efficiente.The combination of nodes() and value() functions uses XML indexes effectively. e, di conseguenza, offre maggiore scalabilità rispetto a OpenXml.As a result, this combination can exhibit more scalability than OpenXml.

Vedere ancheSee Also

OPENXML (SQL Server)OPENXML (SQL Server)