Como utilizar XML FOR PATH e entendendo o problema

Olá, pessoal.

Esses dias tive uma demanda. Solicitaram que eu colocasse o conteúdo da tabela SYP numa linha. Isso realmente me fez pensar. Pois quem conhece a tabela SYP sabe que ela é assim.

SELECT  
*
FROM SYP010
WHERE D_E_L_E_T_ = ' ' 
AND YP_CAMPO = 'CN9_CODOBJ'
AND YP_CHAVE = '001223'

O resultado é esse:

YP_FILIAL YP_CHAVE YP_SEQ YP_TEXTO YP_CAMPO D_E_L_E_T_ R_E_C_N_O_ R_E_C_D_E_L_
1223 1 Caracterização química, física e microbiológica de substratos para plantas CN9_CODOBJ 87 0
1223 2 de acordo com os parâmetros e métodos exigidos pelo Ministério da Agricul CN9_CODOBJ 88 0
1223 3 tura, Abastecimento e Pecuária, ou seja: Ovos viáveis de Helmintos, Colifo CN9_CODOBJ 89 0
1223 4 rmes termotolerantes, Salmonella sp; e os metais pesados: Arsênio, Cádmio, CN9_CODOBJ 90 0
1223 5 Chumbo, Cromo, Mercúrio, Níquel e Selênio CN9_CODOBJ 91 0

 

Como colocar isso tudo numa única linha?!

Realmente é algo confuso. Mas descobri que o SQL Server implementa um função:

STRING_AGG

  • Segue a documentação abaixo:

https://docs.microsoft.com/pt-br/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-ver15

Essa função é para o SQL Server 2017 e o meu SQL Server é de pobre. Um 2014! 🙁

Brincadeiras a parte, nas minhas pesquisas descobri uma função que poderia resolver o meu problema.

XML FOR

  • É uma função utilizada para criar tags XML direto na consulta. Isso facilita bastante o trabalho. Mas não foi pra isso que eu usei ela.

Então vejamos:

SELECT  
YP_TEXTO
FROM SYP010
WHERE D_E_L_E_T_ = ' ' 
AND YP_CAMPO = 'CN9_CODOBJ'
AND YP_CHAVE = '001223'
FOR XML PATH

Ele irá gerar um resultado assim:

XML_F52E2B61-18A1-11d1-B105-00805F49916B
<row><YP_TEXTO>Caracterização química, física e microbiológica de substratos para plantas </YP_TEXTO></row><row><YP_TEXTO> de acordo com os parâmetros e métodos exigidos pelo Ministério da Agricul </YP_TEXTO></row><row><YP_TEXTO>tura, Abastecimento e Pecuária, ou seja: Ovos viáveis de Helmintos, Colifo </YP_TEXTO></row><row><YP_TEXTO>rmes termotolerantes, Salmonella sp; e os metais pesados: Arsênio, Cádmio, </YP_TEXTO></row><row><YP_TEXTO> Chumbo, Cromo, Mercúrio, Níquel e Selênio </YP_TEXTO></row>

 

Se você averiguar já esta tudo numa linha. Mas o formato é um XML. Vamos olhar com mais clareza:

<row>
	<YP_TEXTO>
		Caracterização química, física e microbiológica de substratos para plantas
	</YP_TEXTO>
</row>
<row>
	<YP_TEXTO>
		de acordo com os parâmetros e métodos exigidos pelo Ministério da Agricul
	</YP_TEXTO>
</row>
<row>
	<YP_TEXTO>
		tura, Abastecimento e Pecuária, ou seja: Ovos viáveis de Helmintos, Colifo
	</YP_TEXTO>
</row>
<row>
	<YP_TEXTO>
		rmes termotolerantes, Salmonella sp; e os metais pesados: Arsênio, Cádmio,
	</YP_TEXTO>
</row>
<row>
	<YP_TEXTO>
		Chumbo, Cromo, Mercúrio, Níquel e Selênio
	</YP_TEXTO>
</row>

 

Mesmo assim não podemos utilizar desta maneira. Pois temos 02 tags:

  • <row> </row>
    • Esta marcando o início e fim da expressão.
  • <YP_TEXTO>
    • É o nome do campo e esta marcando outra expressão.

Então eu modifiquei o comando para isso:

SELECT  
YP_TEXTO
FROM SYP010
WHERE D_E_L_E_T_ = ' ' 
AND YP_CAMPO = 'CN9_CODOBJ'
AND YP_CHAVE = '001223'
FOR XML PATH('')

Neste caso quero que substitua a tag: <row> por ‘ ‘ . Isso já muda bastante o resultado.

<YP_TEXTO>
	Caracterização química, física e microbiológica de substratos para plantas
</YP_TEXTO>
<YP_TEXTO>
	de acordo com os parâmetros e métodos exigidos pelo Ministério da Agricul
</YP_TEXTO>
<YP_TEXTO>
	tura, Abastecimento e Pecuária, ou seja: Ovos viáveis de Helmintos, Colifo
</YP_TEXTO>
<YP_TEXTO>
	rmes termotolerantes, Salmonella sp; e os metais pesados: Arsênio, Cádmio,
</YP_TEXTO>
<YP_TEXTO>
	Chumbo, Cromo, Mercúrio, Níquel e Selênio
</YP_TEXTO>

 

No entanto, ainda temos a tag <YP_TEXTO> que é o nome do campo, certo?!

Então, vamos finalizar:

    SELECT  
    REPLACE(LTRIM(RTRIM(YP_TEXTO)),'<YP_TEXTO>', '') 
    FROM SYP010
    WHERE D_E_L_E_T_ = ' ' 
    AND YP_CAMPO = 'CN9_CODOBJ'
    AND YP_CHAVE = '001223'
    FOR XML PATH('')

 

Isso gerou a uma linha única:

XML_F52E2B61-18A1-11d1-B105-00805F49916B
Caracterização química, física e microbiológica de substratos para plantasde acordo com os parâmetros e métodos exigidos pelo Ministério da Agricultura, Abastecimento e Pecuária, ou seja: Ovos viáveis de Helmintos, Coliformes termotolerantes, Salmonella sp; e os metais pesados: Arsênio, Cádmio,Chumbo, Cromo, Mercúrio, Níquel e Selênio

 

Espero que essa dica tenha ajudado. Eu sei que várias outras formas de resolver esse problema. No entanto, esse foi o melhor no momento para mim.

Comente o que achou

Receba nossos novos artigos

Baixe nosso novo e-book Como o SQL Pode Mudar Sua Vida Em 04 Passos

Não enviamos spam. Seu e-mail está 100% seguro!

Sobre o Autor

hamirdhanquer
hamirdhanquer

Olá! Meu nome é Hamir Dhanquer. Atualmente trabalho como: Analista de Sistemas. Meu foco com esse blog é justamente aprender tecnologias e divulgar o que estou aprendendo. Espero que nesse processo posso ajudar você também! Segue abaixo meus contatos: https://www.linkedin.com/in/hamir-dhanquer-costa-noleto-06795922/ https://github.com/HamirDhanquer

0 Comentários

Deixe um comentário

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

plugins premium WordPress