sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo funciona FOR XML PATH('') al concatenar filas

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