CROSS APPLY com FOR XML, dentro de um FOR XML

Esses dias surgiu uma questo 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 criao da estrutura seria algo assim:

Abstraiam aqui qualquer boa prtica ou regra de normalizao… a ideia mostrar a soluo dada. 🙂

Inserindo alguns poucos registros…

Com base nisso, vamos voltar ideia…

Para cada status existente, eu preciso retornar os produtos que no possuem sub-produtos e que passaram por esse status, deixando os produtos entre parnteses.

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

Porm, ao invs 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 descrio?

Para eu concatenar os registros, fao uso do FOR XML PATH… Assim:

Resultado:

img2

 

Concatenou… Mas no 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 vrgula que ficou no primeiro parnteses, ficando:

O que me retorna, finalmente:

img4

 

Bom, talvez essa no seja a soluo mais elegante ou performtica… E a que comea a brincadeira… Como voc faria? Adoraria ver outras solues para o mesmo caso. 😀

Abraos e at uma prxima!

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

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

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