es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

TSQL XPath para nodos con diferentes nombres: En TSQL, XPath se utiliza para buscar y seleccionar nodos en documentos XML. Cuando los nodos tienen diferentes nombres, es posible utilizar el carácter comodín “*” para representar cualquier nombre de nodo. A continuación se presentan ejemplos de cómo utilizar XPath en TSQL para seleccionar nodos con diferentes nombres: 1. Para seleccionar todos los nodos de cualquier nombre en un documento XML: SELECT columnaXml.query(‘/*’) FROM tablaXml 2. Para seleccionar nodos descendientes de cualquier nombre en un documento XML: SELECT columnaXml.query(‘//*’) FROM tablaXml 3. Para seleccionar nodos hijos de cualquier nombre para un nodo padre específico en un documento XML: SELECT columnaXml.query(‘/padre/*’) FROM tablaXml Recuerda que TSQL XPath se utiliza en SQL Server para trabajar con documentos XML dentro de una base de datos.

En SQL Server 2008 (sí, lo sé), ¿cómo se escribe una XPath para encontrar nodos con diferentes nombres?

Por ejemplo, si tuviera alguno de los siguientes XML…

DECLARE @XML XML = ‘12
o…
DECLARE @XML XML = ‘12

Puedo escribir lo siguiente, que funcionará para el primer XML, pero no funcionaría para el segundo XML.

SELECT X.value(‘.’, ‘int’) FROM @XML.nodes(‘/data/id’) AS X(X)

Iba a usar una unión (/data/id | /d/i), pero SQL Server aparentemente no admite uniones.

La solución simple es hacer lo siguiente…

SELECT X.value(‘.’, ‘int’) FROM @XML.nodes(‘/data/id’) AS X(X)
UNION
SELECT X.value(‘.’, ‘int’) FROM @XML.nodes(‘/d/i’) AS X(X)

… pero preferiría que hubiera una única solución de XPath en su lugar.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, en SQL Server 2008, no hay una solución XPath única para encontrar nodos con diferentes nombres en XML. El enfoque de unión es la mejor solución en este caso. Sin embargo, en versiones posteriores de SQL Server (2012 y superiores), se puede utilizar el paso de ruta /* para seleccionar todos los nodos hijos del nodo actual, sin importar el nombre, de la siguiente manera:

    SELECT X.value('.', 'int')
    FROM @XML.nodes('/data/id | /d/i/*') AS X(X)
    

Comments are closed.