sql >> Databasteknik >  >> RDS >> Sqlserver

Hur Stuff och "For XML Path" fungerar i SQL Server?

Så här fungerar det:

1. Hämta XML-elementsträng med FOR XML

Genom att lägga till FOR XML PATH i slutet av en fråga kan du mata ut resultaten av frågan som XML-element, med elementnamnet i PATH-argumentet. Till exempel, om vi skulle köra följande sats:

SELECT ',' + name 
              FROM temp1
              FOR XML PATH ('')

Genom att skicka in en tom sträng (FOR XML PATH('')) får vi istället följande:

,aaa,bbb,ccc,ddd,eee

2. Ta bort inledande kommatecken med STUFF

STUFF-satsen "stoppar" bokstavligen en sträng i en annan och ersätter tecken i den första strängen. Vi använder den dock helt enkelt för att ta bort det första tecknet i den resulterande värdelistan.

SELECT abc = STUFF((
            SELECT ',' + NAME
            FROM temp1
            FOR XML PATH('')
            ), 1, 1, '')
FROM temp1

Parametrarna för STUFF är:

  • Strängen som ska "fyllas" (i vårt fall den fullständiga listan med namn med ett kommatecken)
  • Platsen för att börja radera och infoga tecken (1, vi stoppar in i en tom sträng)
  • Antalet tecken som ska raderas (1, är det inledande kommatecken)

Så vi slutar med:

aaa,bbb,ccc,ddd,eee

3. Gå med på id för att få hela listan

Därefter ansluter vi bara till detta på listan över id i temptabellen, för att få en lista över ID:n med namn:

SELECT ID,  abc = STUFF(
             (SELECT ',' + name 
              FROM temp1 t1
              WHERE t1.id = t2.id
              FOR XML PATH (''))
             , 1, 1, '') from temp1 t2
group by id;

Och vi har vårt resultat:

Id Namn 1aaa,bbb,ccc,ddd,eee

Hoppas detta hjälper!



  1. Vad är MySQL-ekvivalenten för STUFF() i SQL Server?

  2. Crystal Reports vs Microsoft SQL Server Reporting Services

  3. phpMyAdmin kastar en #2002 kan inte logga in på mysql-servern phpmyadmin

  4. PostgreSQL latitud longitud fråga