Buscar..


Observaciones

También hay varios otros modos FOR XML :

  • FOR XML RAW : crea un elemento <row> por fila.
  • FOR XML AUTO - Intenta autogenerar heurísticamente una jerarquía.
  • FOR XML EXPLICIT : proporciona más control sobre la forma del XML, pero es más engorroso que FOR XML PATH .

Hola mundo XML

SELECT 'Hello World' FOR XML PATH('example')
<example>Hello World</example>

Especificando espacios de nombres

SQL Server 2008
WITH XMLNAMESPACES (
    DEFAULT 'http://www.w3.org/2000/svg',
    'http://www.w3.org/1999/xlink' AS xlink
)
SELECT 
    'example.jpg' AS 'image/@xlink:href',
    '50px' AS 'image/@width',
    '50px' AS 'image/@height'
FOR XML PATH('svg')
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
    <image xlink:href="firefox.jpg" width="50px" height="50px"/>
</svg>

Especificando la estructura usando expresiones XPath

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')

Usando FOR XML PATH para concatenar valores

El FOR XML PATH se puede usar para concatenar valores en una cadena. El siguiente ejemplo concatena valores en una cadena CSV :

DECLARE @DataSource TABLE
(
    [rowID] TINYINT
   ,[FirstName] NVARCHAR(32)
);

INSERT INTO @DataSource ([rowID], [FirstName])
VALUES (1, 'Alex')
      ,(2, 'Peter')
      ,(3, 'Alexsandyr')
      ,(4, 'George');

SELECT STUFF
(
    (
        SELECT ',' + [FirstName]
        FROM @DataSource
        ORDER BY [rowID] DESC
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,1
    ,''
);

Algunas notas importantes:

  • La cláusula ORDER BY se puede utilizar para ordenar los valores de una manera preferida
  • si se utiliza un valor más largo como separador de concatenación, el parámetro de la función STUFF debe cambiarse;
SELECT STUFF
(
    (
        SELECT '---' + [FirstName]
        FROM @DataSource
        ORDER BY [rowID] DESC
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,3 -- the "3" could also be represented as: LEN('---') for clarity
    ,''
);
  • a medida que se usan la opción TYPE y la función .value , la concatenación funciona con la cadena NVARCHAR(MAX)


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow