locked
Carregar XML com Namespaces em tabela utilizando sql server 2005 RRS feed

  • Pergunta

  • Olá pessoal,

    Preciso carregar um documento XML em uma tabela do SQL Server 2005. O problema é que eu estou tendo dificuldades de ler o XML e pegar a informação que eu preciso. Vejam o arquivo:

    declare @dadosxml xml

    set @dadosxml = '<nfeProc xmlns = "http://www.portalfiscal.inf.br/nfe" versao = "1.10">
                        <NFe xmlns = "http://www.portalfiscal.inf.br/nfe"
                             xmlns:ds = "http://www.w3.org/2000/09/xmldsig#"
                             xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
                            <infNFe Id = "NFe11090804082624001551550010000091270038872773" versao = "1.10"/>
                        </NFe>
                    </nfeProc>'

    SELECT
         NFe.A.value('
            declare default element namespace "http://www.portalfiscal.inf.br/nfe";
            (./x:Id)[1]','varchar(100)') As Id
    FROM @dadosxml.nodes('
        declare default element namespace "http://www.portalfiscal.inf.br/nfe";
        /x:nfeProc/x:NFe/x:infNFe') NFe(A)

    O arquivo existe fisicamente desta forma. Esse é apenas um trecho para exemplificar o problema. Eu não posso excluir os namespaces. Preciso extrair o Id e a versão. Alguém pode me ajudar ?!?

    Grata,

    Letícia
    sexta-feira, 28 de agosto de 2009 14:44

Todas as Respostas

  • letgaude,

    Mas qual é a mensagem de erro que você esta recebendo?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sábado, 29 de agosto de 2009 21:18
  • letgaude,

    Veja se este exemplo ajuda:

    declare

     

    @dadosxml xml

    set

     

    @dadosxml = '<?xml version="1.0"?>

    <root>

    <cliente id="1">

    <prod id="321"/>

    <prod id="543"/>

    <prod id="762"/>

    <prod id="325"/>

    </cliente>

    <cliente id="2">

    <prod id="289"/>

    <prod id="776"/>

    <prod id="335"/>

    <prod id="1020"/>

    </cliente>

    </root>'

    --print convert(nvarchar(4000),@dadosxml)

    SELECT

    t

    .c.value('../@id[1]','int') as IdCliente,

    t

    .c.value('@id[1]','int') as IdProduto

    FROM

    @dadosxml

    .nodes('/root/cliente/prod') as t(c)

    dECLARE

     

    @x xml

    SET

     

    @x='<Root>

    <row id="1"><name>Larry</name><oflw>some text</oflw></row>

    <row id="2"><name>moe</name></row>

    <row id="3" />

    </Root>'

    SELECT

     

    T.c.query('.') AS result

    FROM

     

    @x.nodes('/Root/row') T(c)

    GO


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sábado, 29 de agosto de 2009 21:24
  • Seu código não funciona simplesmente porque você declarou um namespace padrão e mesmo assim usou um namespace nas ramificações do xml, que seria o x: (/x:nfeProc/x:NFe/x:infNFe'), então o código certo seria:


    declare

     

    @dadosxml xml

    set

     

    @dadosxml = '<nfeProc xmlns = "http://www.portalfiscal.inf.br/nfe" versao = "1.10">

    <NFe xmlns = "http://www.portalfiscal.inf.br/nfe"

    xmlns:ds = "http://www.w3.org/2000/09/xmldsig#"

    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">

    <infNFe Id = "NFe11090804082624001551550010000091270038872773" versao = "1.10"/>

    </NFe>

    </nfeProc>'

    SELECT

    NFe

    .A.value('

    declare default element namespace "http://www.portalfiscal.inf.br/nfe";

    (@Id)[1]'

     

    ,'varchar(100)') As Id

    FROM

     

    @dadosxml.nodes('

    declare default element namespace "http://www.portalfiscal.inf.br/nfe";

    /nfeProc/NFe/infNFe'

     

    ) NFe(A)


    Aarão Junior
    segunda-feira, 18 de janeiro de 2010 14:26