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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: a lo largo de 2024, eliminaremos gradualmente los problemas de GitHub como mecanismo de comentarios para el contenido y lo reemplazaremos por un nuevo sistema de comentarios. Para obtener más información, consulte:Enviar y ver comentarios de