Wat FOR XML PATH('xxx')
doet is een XML-tekenreeks maken voor de resultatenset die elke rij in een <xxx></xxx>
plaatst element en elke kolomwaarde binnen de rij, in een element met de naam voor die kolom.
Als het PATH leeg is (d.w.z. PATH('')
) het laat het rij-element weg in de XML-generatie. Als de kolom geen naam heeft, wordt het kolomelement in de XML-generatie weggelaten. Als beide PATH leeg zijn en kolommen geen naam hebben, wordt het in feite een aaneenschakeling van alle rijen.
Voer de volgende instructies uit om een beter inzicht in het proces te krijgen:
-- 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;
Nu hoor ik je vragen:hoe kan ik de kolomnaam verwijderen als ik gewoon een kolom uit een tabel selecteer. Er zijn verschillende manieren, in volgorde van mijn voorkeur:
- XQuery-eigenschappen:
SELECT [text()]=column_name ...
- Gebruik een subquery om de kolomwaarde te selecteren:
SELECT (SELECT column_name) ...
- CAST de kolom naar zijn type:
SELECT CAST(column_value AS <TYPE of the column>) ...
Voorbeelden:
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('');