Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come funziona FOR XML PATH('') durante la concatenazione di righe

Cosa FOR XML PATH('xxx') non è creare una stringa XML per il set di risultati che inserisce ogni riga in un <xxx></xxx> elemento e ogni valore di colonna all'interno della riga, in un elemento con il nome di quella colonna.

Se il PATH è vuoto (cioè PATH('') ) omette l'elemento riga nella generazione XML. Se la colonna non ha un nome, omette l'elemento della colonna nella generazione XML. Quando entrambi PATH sono vuoti e le colonne non hanno nomi, diventa effettivamente una concatenazione di stringhe di tutte le righe.

Esegui le seguenti istruzioni per avere una visione migliore del processo:

-- 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;

Ora ti sento chiedere:come posso rimuovere il nome della colonna quando seleziono semplicemente una colonna da una tabella. Ci sono diversi modi, in ordine di mia preferenza:

  • Proprietà XQuery:SELECT [text()]=column_name ...
  • Utilizza una sottoquery per selezionare il valore della colonna:SELECT (SELECT column_name) ...
  • CAST della colonna al suo tipo:SELECT CAST(column_value AS <TYPE of the column>) ...

Esempi:

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