Cómo FOR XML TRABAJO (”) funciona al concatenar filas

¿Cómo funciona la cláusula FOR XML PATH ('') cuando concatena filas en SQL Server?

Solo quiero una explicación de cómo funciona la cláusula FOR XML PATH ('')

Lo que FOR XML PATH('xxx') hace es crear una cadena XML para el conjunto de resultados que coloca cada fila en un elemento y cada valor de columna dentro de la fila, en un elemento con el nombre de esa columna.

Si el PATH está vacío (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 tanto PATH está vacía como las columnas no tienen nombres, efectivamente se convierte en una concatenación de cadenas de todas las filas.

Ejecute las siguientes declaraciones para obtener una mejor visión en el proceso:

 -- Each row is in a  element -- Each column in that row in a  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  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 maneras, en orden de mi preferencia:

  • Propiedades de XQuery: SELECT [text()]=column_name ...
  • Use una subconsulta para seleccionar el valor de la columna: SELECT (SELECT column_name) ...
  • COLOQUE la columna a su tipo: SELECT CAST(column_value AS ) ...

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