Aqui está como funciona:
1. Obter string de elemento XML com FOR XML
Adicionar FOR XML PATH ao final de uma consulta permite que você exiba os resultados da consulta como elementos XML, com o nome do elemento contido no argumento PATH. Por exemplo, se fôssemos executar a seguinte instrução:
SELECT ',' + name
FROM temp1
FOR XML PATH ('')
Ao passar uma string em branco (FOR XML PATH('')), obtemos o seguinte:
,aaa,bbb,ccc,ddd,eee
2. Remova a vírgula à esquerda com STUFF
A instrução STUFF literalmente "coloca" uma string na outra, substituindo caracteres dentro da primeira string. No entanto, estamos usando-a simplesmente para remover o primeiro caractere da lista de valores resultante.
SELECT abc = STUFF((
SELECT ',' + NAME
FROM temp1
FOR XML PATH('')
), 1, 1, '')
FROM temp1
Os parâmetros de
STUFF
estão:- A string a ser "recheada" (no nosso caso, a lista completa de nomes com uma vírgula à esquerda)
- O local para começar a excluir e inserir caracteres (1, estamos inserindo uma string em branco)
- O número de caracteres a serem excluídos (1, sendo a vírgula inicial)
Assim terminamos com:
aaa,bbb,ccc,ddd,eee
3. Junte-se ao id para obter a lista completa
Em seguida, apenas juntamos isso na lista de id na tabela temporária, para obter uma lista de IDs com nome:
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;
E temos nosso resultado:
Espero que isto ajude!