The following is a detailed breakdown of the solution from the msdn archive.
The scenario I'm covering here is the need to aggregate all the IDs in a joined table into a single column on the master table. We'll use a table structure like this:
CREATE TABLE Parent ( Id int NOT NULL identity, Name varchar(50) NOT NULL, Children varchar(256) NULL, ) CREATE TABLE Child ( Id int NOT NULL identity, ParentId int NOT NULL, Name varchar(50) NOT NULL )Create some sample data:
INSERT INTO Parent (Name) VALUES ('Parent 1'), ('Parent 2'), ('Parent 3') INSERT INTO Child (ParentId, Name) VALUES (1, 'Child 1'), (1, 'Child 2'), (1, 'Child 3'), (2, 'Child 4'), (2, 'Child 5'), (3, 'Child 6'), (3, 'Child 7'), (3, 'Child 8'), (3, 'Child 9')Now we can update the Children column on Parent with this:
; WITH t AS (SELECT p1.Id, Children = ( SELECT (',' + convert(varchar, c2.Name )) FROM Parent p2 JOIN Child c2 ON p2.Id = c2.ParentId WHERE p2.Id = p1.Id ORDER BY c2.Id FOR XML PATH( '' ) ) + ',' FROM Parent p1 JOIN Child c1 ON p1.Id = c1.ParentId GROUP BY p1.Id) UPDATE p SET Children = t.Children FROM Parent p JOIN t ON t.Id = p.IdAnd the results look like:
Id | Name | Children 1 | Parent 1 | ,Child 1,Child 2,Child 3, 2 | Parent 2 | ,Child 4,Child 5, 3 | Parent 3 | ,Child 6,Child 7,Child 8,Child 9,