|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
fdsilva.desenv Novato
Registrado: Quarta-Feira, 28 de Novembro de 2012 Mensagens: 68
|
Enviada: Seg Mai 21, 2018 5:35 pm Assunto: Pegar um valor de uma determinada string |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Mai 21, 2018 8:51 pm Assunto: |
|
|
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 |
|
|
fdsilva.desenv Novato
Registrado: Quarta-Feira, 28 de Novembro de 2012 Mensagens: 68
|
Enviada: Ter Mai 22, 2018 8:39 am Assunto: |
|
|
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 |
|
|
fdsilva.desenv Novato
Registrado: Quarta-Feira, 28 de Novembro de 2012 Mensagens: 68
|
Enviada: Ter Mai 22, 2018 8:53 am Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Mai 22, 2018 9:53 am Assunto: |
|
|
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 |
|
|
fdsilva.desenv Novato
Registrado: Quarta-Feira, 28 de Novembro de 2012 Mensagens: 68
|
Enviada: Ter Mai 22, 2018 9:57 am Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Mai 22, 2018 10:03 am Assunto: |
|
|
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 |
|
|
fdsilva.desenv Novato
Registrado: Quarta-Feira, 28 de Novembro de 2012 Mensagens: 68
|
Enviada: Ter Mai 22, 2018 10:15 am Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Mai 22, 2018 10:20 am Assunto: |
|
|
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 |
|
|
fdsilva.desenv Novato
Registrado: Quarta-Feira, 28 de Novembro de 2012 Mensagens: 68
|
Enviada: Ter Mai 22, 2018 10:38 am Assunto: |
|
|
Também apareceu null o campo Imex.
Será que tem que buscar a estrutura inteira do XML? |
|
Voltar ao Topo |
|
|
fdsilva.desenv Novato
Registrado: Quarta-Feira, 28 de Novembro de 2012 Mensagens: 68
|
Enviada: Ter Mai 22, 2018 11:00 am Assunto: |
|
|
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 |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|