Qué FOR XML PATH('xxx')
lo que hace es crear una cadena XML para el conjunto de resultados que coloca cada fila en un <xxx></xxx>
elemento y cada valor de columna dentro de la fila, en un elemento con el nombre de esa columna.
Si la RUTA está vacía (es decir, PATH('')
) omite el elemento de fila en la generación de XML. Si la columna no tiene nombre, omite el elemento de columna en la generación XML. Cuando ambos PATH están vacíos y las columnas no tienen nombres, se convierte efectivamente en una concatenación de cadenas de todas las filas.
Ejecute las siguientes declaraciones para obtener una mejor perspectiva del proceso:
-- Each row is in a <beta></beta> element
-- Each column in that row in a <alfa></alfa> element (the column name)
SELECT
alfa=','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
FOR
XML PATH('beta');
-- Since the PATH is empty, the rows are not put inside an element
-- Each column in that row is in a <alfa></alfa> element (the column name)
SELECT
alfa=','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
FOR
XML PATH('');
-- Since the PATH is empty, the rows are not put inside an element
-- Since the column has no name it is not put inside an element
SELECT
','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
FOR
XML PATH('');
-- This uses the STUFF function to remove the leading comma to get a proper comma-seperated list
SELECT STUFF((
SELECT
','+TABLE_SCHEMA + '.' + TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
FOR
XML PATH('')
),1,1,''
) AS comma_seperated_list;
Ahora te escucho preguntar:¿Cómo puedo eliminar el nombre de la columna cuando simplemente selecciono una columna de una tabla? Hay varias formas, en orden de mi preferencia:
- Propiedades de XQuery:
SELECT [text()]=column_name ...
- Utilice una subconsulta para seleccionar el valor de la columna:
SELECT (SELECT column_name) ...
- CAST la columna a su tipo:
SELECT CAST(column_value AS <TYPE of the column>) ...
Ejemplos:
SELECT
[text()]=TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
FOR
XML PATH('');
SELECT
(SELECT TABLE_NAME)
FROM
INFORMATION_SCHEMA.TABLES
FOR
XML PATH('');
SELECT
CAST(TABLE_NAME AS SYSNAME)
FROM
INFORMATION_SCHEMA.TABLES
FOR
XML PATH('');