ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Pegar um valor de uma determinada string

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
fdsilva.desenv
Novato
Novato


Registrado: Quarta-Feira, 28 de Novembro de 2012
Mensagens: 68

MensagemEnviada: Seg Mai 21, 2018 5:35 pm    Assunto: Pegar um valor de uma determinada string Responder com Citação

Prezados, boa tarde.

Preciso de uma query que busque para mim, um valor que está contido dentrod e uma string.

Por exemplo
Campo "Obs" da tabela "Teste" possui o seguinte valor: "<item>12</item><peso>1.5</peso><altura>0.2</altura>"

Deste valor todo acima, eu quero apenas o resultado do peso, ou seja, quero que a query me traga o valor "1.5".

Como devo proceder?

Meu banco de dados é o SQL Server 2008.

Obrigado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Mai 21, 2018 8:51 pm    Assunto: Responder com Citação

Boa noite,

Experimente fazer uns testes dessa forma:

Código:
select cast(Obs as xml).value('(/peso[1])', 'numeric(9, 3)') as Peso
from Teste


Espero que ajude


Editado pela última vez por imex em Dom Out 01, 2023 4:18 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
fdsilva.desenv
Novato
Novato


Registrado: Quarta-Feira, 28 de Novembro de 2012
Mensagens: 68

MensagemEnviada: Ter Mai 22, 2018 8:39 am    Assunto: Responder com Citação

Imex, obrigado pelo retorno. Fiz um teste em outras tabelas e ocorreu legal a sua ideia.

Mas levando para o a minha necessidade aqui, o meu campo é uma tabela chamada NF_XML, onde eu quero buscar o valor que está dentro do <vOutro> </vOutro> no campo chamado XML, esse campo é um tipo "text".

Seguindo a sua regra, fiz as alterações e ficou assim:
Código:

select cast(NF_XML.XML as XML).value('(/vOutro[1])', 'numeric(9, 3)') as vOutro
from NF_XML


E apareceu o seguinte erro: "Msg 9420, Level 16, State 1, Line 1
XML parsing: line 12, character 267, illegal xml character"

Neste caso, como prosseguir?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
fdsilva.desenv
Novato
Novato


Registrado: Quarta-Feira, 28 de Novembro de 2012
Mensagens: 68

MensagemEnviada: Ter Mai 22, 2018 8:53 am    Assunto: Responder com Citação

Imex, esse erro eu já peguei. Determinado XML não estava corretamente cadastrado na tabela.

Agora, eu percebi que o campo que eu busco "<vOutro>" ele possui em dois lugares do XML, dentro dos produtos e dentro da <total>. No caso eu preciso do campo <vOutros> que está dentro de <total>. Por gentileza, Saberia como fazer isso?

Obrigado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Mai 22, 2018 9:53 am    Assunto: Responder com Citação

Nesse caso experimente colocar o caminho completo no primeiro parâmetro do Value:

Código:
select cast(NF_XML.XML as XML).value('(/total/vOutro[1])', 'numeric(9, 3)') as vOutro


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
fdsilva.desenv
Novato
Novato


Registrado: Quarta-Feira, 28 de Novembro de 2012
Mensagens: 68

MensagemEnviada: Ter Mai 22, 2018 9:57 am    Assunto: Responder com Citação

Oi IMEX, apresentou um erro.

Código:
select
   cast(XML as XML).value('(/total/vOutro[1])', 'numeric(9, 3)') as vOutro
from nf inner join nf_xml x on x.CODNF = nf.codnf
where (nf.OUTRAS_DESP > 0 or nf.DESPESA_ACESS > 0)


erro: Msg 2389, Level 16, State 1, Line 2
XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Mai 22, 2018 10:03 am    Assunto: Responder com Citação

Experimente mudar o local do fechamento dos parênteses:

Código:
   cast(XML as XML).value('(/total/vOutro)[1]', 'numeric(9, 3)') as vOutro


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
fdsilva.desenv
Novato
Novato


Registrado: Quarta-Feira, 28 de Novembro de 2012
Mensagens: 68

MensagemEnviada: Ter Mai 22, 2018 10:15 am    Assunto: Responder com Citação

Certo, a query rodou, mas trouxe os campos = NULL.

Porém eu rodei uma query para filtrar apenas as notas que possuem valor dentro dessa chave <vOutro>.

Código:
select nf.DESPESA_ACESS, nf.OUTRAS_DESP, cast(XML as xml),
   cast(XML as XML).value('(/total/vOutro)[1]', 'numeric(9, 3)') as vOutro
from nf inner join nf_xml x on x.CODNF = nf.codnf
where (nf.OUTRAS_DESP > 0 or nf.DESPESA_ACESS > 0)


Um desses XML, por exemplo traz o valor de <vOutros>

segue exemplo abaixo:


Citação:

<total>
<ICMSTot>
<vBC>358.68</vBC>
<vICMS>64.57</vICMS>
<vICMSDeson>0.00</vICMSDeson>
<vFCPUFDest>0.00</vFCPUFDest>
<vBCST>0.00</vBCST>
<vST>0.00</vST>
<vProd>235.68</vProd>
<vFrete>0.00</vFrete>
<vSeg>0.00</vSeg>
<vDesc>0.00</vDesc>
<vII>0.00</vII>
<vIPI>0.00</vIPI>
<vPIS>3.39</vPIS>
<vCOFINS>15.64</vCOFINS>
<vOutro>123.00</vOutro>
<vNF>358.68</vNF>
<vTotTrib>65.21</vTotTrib>
</ICMSTot>
</total>
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Mai 22, 2018 10:20 am    Assunto: Responder com Citação

Pelo exemplo o vOutro está abaixo de ICMSTot, então experimente:

Código:
   cast(XML as XML).value('(/total/ICMSTot/vOutro)[1]', 'numeric(9, 3)') as vOutro


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
fdsilva.desenv
Novato
Novato


Registrado: Quarta-Feira, 28 de Novembro de 2012
Mensagens: 68

MensagemEnviada: Ter Mai 22, 2018 10:38 am    Assunto: Responder com Citação

Também apareceu null o campo Imex.

Será que tem que buscar a estrutura inteira do XML?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
fdsilva.desenv
Novato
Novato


Registrado: Quarta-Feira, 28 de Novembro de 2012
Mensagens: 68

MensagemEnviada: Ter Mai 22, 2018 11:00 am    Assunto: Responder com Citação

Imex, acabei utilizando uma outra forma.

Com Substring e PatIndex consegui o desejável.

Segue código a quem interessar:

Código:

select nf.DESPESA_ACESS, nf.OUTRAS_DESP, cast(XML as xml),
  SUBSTRING(Substring(XML,Patindex('%<total>%',XML),500),
  Patindex('%<vOutro>%',Substring(XML,Patindex('%<total>%',XML),500))+8,
  Patindex('%</vOutro>%',Substring(XML,Patindex('%<total>%',XML),500)) - (Patindex('%<vOutro>%',Substring(XML,Patindex('%<total>%',XML),500))+8)
  )
from nf inner join nf_xml x on x.CODNF = nf.codnf
where (nf.OUTRAS_DESP > 0 or nf.DESPESA_ACESS > 0)


Obrigado pelo apoio, deu pra abrir minha mente a buscar novas soluções.

Até mais.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB