Microsoft SQL Server Especificando la estructura usando expresiones XPath


Ejemplo

SELECT
    'XPath example' AS 'head/title',
    'This example demonstrates ' AS 'body/p',
    'https://www.w3.org/TR/xpath/' AS 'body/p/a/@href',
    'XPath expressions' AS 'body/p/a'
FOR XML PATH('html')
<html>
    <head>
        <title>XPath example</title>
    </head>
    <body>
        <p>This example demonstrates <a href="https://www.w3.org/TR/xpath/">XPath expressions</a></p>
    </body>
</html>

En FOR XML PATH , las columnas sin nombre se convierten en nodos de texto. NULL o '' por lo tanto se convierten en nodos de texto vacíos. Nota: puede convertir una columna con nombre en una sin nombre usando AS *

DECLARE @tempTable TABLE (Ref INT, Des NVARCHAR(100), Qty INT)
INSERT INTO @tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2)

SELECT ROW_NUMBER() OVER (ORDER BY Ref) AS '@NUM',
     'REF' AS 'FLD/@NAME', REF AS 'FLD', '',
     'DES' AS 'FLD/@NAME', DES AS 'FLD', '',
     'QTY' AS 'FLD/@NAME', QTY AS 'FLD'
FROM @tempTable 
FOR XML PATH('LIN'), ROOT('row')
<row>
  <LIN NUM="1">
    <FLD NAME="REF">100001</FLD>
    <FLD NAME="DES">Normal</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="2">
    <FLD NAME="REF">100002</FLD>
    <FLD NAME="DES">Foobar</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="3">
    <FLD NAME="REF">100003</FLD>
    <FLD NAME="DES">Hello World</FLD>
    <FLD NAME="QTY">2</FLD>
  </LIN>
</row>

El uso de nodos de texto (vacíos) ayuda a separar el nodo de salida anterior del siguiente, de modo que SQL Server sabe que debe comenzar un nuevo elemento para la siguiente columna. De lo contrario, se confunde cuando el atributo ya existe en lo que cree que es el elemento "actual".

Por ejemplo, sin las cadenas vacías entre el elemento y el atributo en la declaración SELECT , SQL Server da un error:

La columna centrada en los atributos 'FLD / @ NAME' no debe aparecer después de un hermano no centrado en los atributos en la jerarquía XML en FOR XML PATH.

También tenga en cuenta que este ejemplo también envolvió el XML en un elemento raíz llamado row , especificado por ROOT('row')