In diesem Beitrag haben wir uns mit der Rückgabe von Werten einer Spalte als separierte Liste beschäftigt. Vielfach sieht man aber auch die Anforderung, diese Liste auf der Basis eines bestimmten Schlüsselwertes zu generieren.
Zum Beispiel eine Liste, die alle Kunden-Nr und die dazugehörigen Bestellungen ausweist. Die XML Funktionalitäten des SQL Servers ab Version 2005 in Zusammenarbeit mit CROSS APPLY machen durchaus eine leichte Übung:
SELECT CustomerID, LEFT(MyCommaSeparatedList
, LEN(MyCommaSeparatedList)-1) AS MyCommaSeparatedList
FROM Northwind.dbo.Customers c
CROSS APPLY
(SELECT CAST(OrderID AS NVARCHAR(10)) + ','
FROM Northwind.dbo.Orders o
WHERE o.CustomerID = c.CustomerID
ORDER BY o.OrderID
FOR XML PATH('')) AS x(MyCommaSeparatedList)
CustomerID MyCommaSeparatedList
---------- ------------------------------------------
ALFKI 10643,10692,10702,10835,10952,11011
ANATR 10308,10625,10759,10926
ANTON 10365,10507,10535,10573,10677,10682,10856
Ein weiterer angenehmer "Nebeneffekt" ist, daß man dadurch nicht mehr der 8000 Zeichen Grenze des VARCHAR Datentypen unterliegt, sondern der Grenze des XML Datentypen unterliegt, die bei ca. 2 GB liegt.