Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsweise von FOR XML PATH('') beim Verketten von Zeilen

Was FOR XML PATH('xxx') erstellt eine XML-Zeichenfolge für die Ergebnismenge, die jede Zeile in einen <xxx></xxx> einfügt -Element und jeden Spaltenwert innerhalb der Zeile in einem Element mit dem Namen für diese Spalte.

Wenn der PATH leer ist (d.h. PATH('') ) lässt es das Zeilenelement in der XML-Generierung weg. Wenn die Spalte keinen Namen hat, wird das Spaltenelement bei der XML-Generierung weggelassen. Wenn sowohl PATH leer ist als auch Spalten keine Namen haben, wird es effektiv zu einer String-Verkettung aller Zeilen.

Führen Sie die folgenden Anweisungen aus, um einen besseren Einblick in den Prozess zu erhalten:

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

Jetzt höre ich Sie fragen:Wie kann ich den Spaltennamen entfernen, wenn ich einfach eine Spalte aus einer Tabelle auswähle. Es gibt mehrere Möglichkeiten, in der Reihenfolge meiner Präferenz:

  • XQuery-Eigenschaften:SELECT [text()]=column_name ...
  • Verwenden Sie eine Unterabfrage, um den Spaltenwert auszuwählen:SELECT (SELECT column_name) ...
  • CAST die Spalte in ihren Typ:SELECT CAST(column_value AS <TYPE of the column>) ...

Beispiele:

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