Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como o Stuff e o 'For XML Path' funcionam no SQL Server?


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:
ID Nome 1aaa,bbb,ccc,ddd,ee
Espero que isto ajude!