sql >> Database >  >> RDS >> Sqlserver

Hoe FOR XML PATH('') werkt bij het aaneenschakelen van rijen

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



  1. HHVM gebruiken met WordPress

  2. Heroku Postgres:Te veel verbindingen. Hoe vernietig ik deze verbindingen?

  3. mysql selecteren uit n laatste rijen

  4. Oracle Leeftijdsberekening vanaf geboortedatum en vandaag