Microsoft SQL Server
PARA XML PATH
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 queFOR XML PATH
.
Hola mundo XML
SELECT 'Hello World' FOR XML PATH('example')
<example>Hello World</example>
Especificando espacios de nombres
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 cadenaNVARCHAR(MAX)