Co FOR XML PATH('xxx')
vytvoří řetězec XML pro sadu výsledků, který vloží každý řádek do <xxx></xxx>
prvek a každou hodnotu sloupce uvnitř řádku v prvku s názvem daného sloupce.
Pokud je PATH prázdná (tj. PATH('')
) vynechá prvek řádku při generování XML. Pokud sloupec nemá žádný název, vynechá prvek sloupce při generování XML. Když jsou obě PATH prázdné a sloupce nemají žádné názvy, stane se zřetězením řetězců všech řádků.
Spusťte následující příkazy, abyste získali lepší přehled o procesu:
-- 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;
Teď slyším, jak se ptáte:Jak mohu odstranit název sloupce, když jednoduše vyberu sloupec z tabulky. Existuje několik způsobů, v pořadí podle mých preferencí:
- Vlastnosti XQuery:
SELECT [text()]=column_name ...
- Pro výběr hodnoty sloupce použijte dílčí dotaz:
SELECT (SELECT column_name) ...
- ODESLÁNÍ sloupce na jeho typ:
SELECT CAST(column_value AS <TYPE of the column>) ...
Příklady:
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('');