CROSS APPLY com FOR XML, dentro de um FOR XML

Esses dias surgiu uma questão aqui no trabalho que acho que vale o registro…

Me questionaram sobre a possibilidade de concatenar o resultado de diversas linhas em uma única e, imediatamente, me veio o bom e velho FOR XML PATH(”) em mente.

O problema é que o resultado deveria ser concatenado de acordo com o resultado proveniente de uma outra tabela, algo como:

A criação da estrutura seria algo assim:

Abstraiam aqui qualquer boa prática ou regra de normalização… a ideia é mostrar a solução dada. 🙂

Inserindo alguns poucos registros…

Com base nisso, vamos voltar à ideia…

Para cada status existente, eu preciso retornar os produtos que não possuem sub-produtos e que passaram por esse status, deixando os produtos entre parênteses.

A primeira ideia ao ler a descrição pode ser fazer usando um cursor, varrendo registro a registro e concatenando o valor.

Porém, ao invés de pensar por registro, vamos pensar diferente….

A consulta que vai retornar o que eu preciso inicialmente:

O retorno será:

 

img1

 

Agora, como deixar a sigla em uma linha, por descrição?

Para eu concatenar os registros, faço uso do FOR XML PATH… Assim:

Resultado:

img2

 

Concatenou… Mas não era bem isso…

Como o que eu preciso é executar uma vez o FOR XML PATH para cada status existente, vamos usar o Operador APPLY (CROSS APPLY, no meu caso), que realiza esse comportamento, mas aí vamos ter que mudar algumas coisas na query.

Em tempo… Lembrem que a tabela que eu tenho como base é a Status e que é o retorno dos produtos que eu quero concatenar.

A consulta fica assim:

O resultado:

img3

 

Opa! Estamos quase lá… Agora, basicamente, o que precisamos é reaplicar o FOR XML PATH nesse resultado e formatar a vírgula que ficou no primeiro parênteses, ficando:

O que me retorna, finalmente:

img4

 

Bom, talvez essa não seja a solução mais elegante ou performática… E é aí que começa a brincadeira… Como você faria? Adoraria ver outras soluções para o mesmo caso. 😀

Abraços e até uma próxima!

PS: Caso queira pegar o script com todo o passo a passo para executar na tua máquina, veja no meu gitHub: https://github.com/LoganMerazzi/SQLServerScripts/blob/master/FOR%20XML%20e%20APPLY

Deixe uma resposta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.