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.
Receba nossos novos artigos
Baixe nosso novo e-book Como o SQL Pode Mudar Sua Vida Em 04 Passos
Sobre o Autor
0 Comentários