Usar los métodos value() y nodes() con OPENXML

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Puede usar varios métodos value() en el tipo de datos xml de una cláusula SELECT para generar un conjunto de filas de valores extraídos. El método nodes() da como resultado una referencia interna para cada nodo seleccionado, que se puede usar para hacer más consultas. La combinación de los métodos nodes() y value() puede ser más eficaz para generar el conjunto de filas cuando tiene varias columnas y, tal vez, cuando las expresiones de ruta de acceso empleadas en su generación son complejas.

El método nodes() da como resultado instancias de un tipo de datos xml especial, cada una de las cuales tiene su contexto establecido en un nodo seleccionado diferente. Este tipo de instancia XML admite los métodos query(), value(), nodes() y exist(), y se puede usar en agregaciones count(*). Otros usos generarían un error.

Ejemplo: utilizar nodes()

Suponga que desea extraer el nombre y los apellidos de los autores cuyo nombre no sea "David". Además, desea extraer esta información como un conjunto de filas que contenga dos columnas: FirstName y LastName. Con los métodos nodes() y value() puede lograrlo, como se indica aquí:

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;

En este ejemplo, nodes('//author') da como resultado un conjunto de filas de referencias a elementos <author> para cada instancia XML. Los nombres y apellidos de los autores se obtienen evaluando los métodos value() relativos a esas referencias.

SQL Server 2000 permite generar un conjunto de filas a partir de una instancia XML con OpenXml(). Puede especificar el esquema relacional para el conjunto de filas y la manera en que se asignan los valores dentro de la instancia XML a columnas del conjunto de filas.

Ejemplo: utilizar OPENXML() en el tipo de datos xml

La consulta se puede volver a escribir a partir del ejemplo anterior usando OpenXml() como se indica aquí. Para ello, se crea un cursor que lee cada instancia XML en una variable XML y luego le aplica OpenXML:

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 representación en la memoria y usa tablas de trabajo en lugar del procesador de consultas. Se basa en el procesador de XPath versión 1.0 de MSXML versión 3.0 en lugar del motor de XQuery. Las tablas de trabajo no se comparten entre varias llamadas a OpenXml(), ni siquiera en la misma instancia XML. Esto limita su escalabilidad. OpenXml() permite el acceso a un formato de tabla irregular para los datos XML cuando no se especifica la cláusula WITH. Además, permite utilizar el valor XML restante en una columna de "desbordamiento" independiente.

En la combinación de las funciones nodes() y value() se usan índices XML con eficacia. Como resultado, esta combinación puede ofrecer una mayor escalabilidad que OpenXml.

Consulte también