none
Ajuda Ler XML Nota Fiscal Eletrônica

    Question

  • Boa tarde a todos.

    Estou tentando desenvolver uma procedure que leia um arquivo xml enviado pela receita, porém não estou conseguindo..

    Abaixo o código de testes que fiz..

     

    declare @idoc xml
    set
    @idoc = 'xml da RECEITA (omiti para não ter problemas)'
    DECLARE @hdoc int
    EXEC
    sp_xml_preparedocument @hdoc OUTPUT, @idoc
    SELECT * FROM OPENXML(@hdoc, '/nfeProc/NFe/infNFe/ide/')
    WITH (cNF int)

    Como teste tentei ler apenas um campo, mas o valor retornado é NULL..



    Monday, August 17, 2009 6:57 PM

Answers

  • New Civic

    error system 3, geralmente é caminho não encontrado...
    vc esta conectado em um server SQL que esta instalado na sua maquina? pq o caminho que vc esta informando ele vai pesquisar no servidor.

    compartilhe o diretorio e passe o caminho do compartilhamento \\suamaquina\pasta\arquivo

    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    • Marked as answer by New Civic Tuesday, August 18, 2009 8:23 PM
    Tuesday, August 18, 2009 12:24 PM
    Moderator
  • Olá New Civic,

    Sobre qual conta o SQL Server está rodando? Acredito que o usuário do SQL Server não tem permissão de acesso nesta pasta ou o arquivo não está neste caminho.

    Abraços

    Demétrio Silva
    • Marked as answer by New Civic Tuesday, August 18, 2009 8:23 PM
    Tuesday, August 18, 2009 12:21 PM
  • Iniciar / SQL server / Configuration Tools / Sql Server Configuration Manager / SQL Server Services / Botão direto e propeiedades em SQL Server ( sua instancia ).

    Abraços

    Demétrio Silva
    • Marked as answer by New Civic Tuesday, August 18, 2009 8:24 PM
    Tuesday, August 18, 2009 12:46 PM
  • A sintaxe do Bulk está errada E de qualquer forma não dá p/ você fazer um "Select" de um exec no caso da CTE.

    Após algumas brigas com o Encoding segue uma sugestão:

    DECLARE @ARQUIVO varchar(255)
    DECLARE @PASTA varchar(255)
    DECLARE @SqlString varchar(4000)

    DECLARE @doc varchar(max)
    DEclare @doc2 XML

    SET @PASTA = 'C:\'

    Drop Table #Arquivos
    CREATE TABLE #Arquivos (arquivo varchar (255))
    INSERT INTO #Arquivos (arquivo) Exec master.dbo.xp_cmdshell 'dir C:\*.xml /b'

    SELECT top 1 @ARQUIVO=arquivo FROM #Arquivos

    Create Table #tmpLista (xCol NVarChar(max))
    --
    Set @SqlString = 'Insert Into #tmpLista(xCol)
    SELECT cast(BulkColumn as NVarchar(max))
         FROM OPENROWSET (BULK '''+ @PASTA + @ARQUIVO + ''', SINGLE_BLOB) AS xCol'
     
    Execute(@SqlString)

    Update #tmpLista set xCol = replace(xCol,  'xmlns="http://www.portalfiscal.inf.br/nfe"', '')
    Update #tmpLista set xCol = replace(xCol,  'encoding="UTF-8"', '')

    Select cast(xCol as XML) from #tmpLista

    Drop TABLE #tmpLista


    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil
    • Marked as answer by New Civic Tuesday, August 18, 2009 6:00 PM
    Tuesday, August 18, 2009 4:44 PM

All replies

  • Olá,

    Qual o seu SQL Server? Sem a estrutura do documento fica difícil. Posta uma parte do código.

    Abraços
    Demétrio Silva
    Monday, August 17, 2009 7:03 PM
  • Amigo, aparentemente o Select está certo, porém sem saber a estrutura completa do XML fica um pouco dificil....



    DECLARE @hdoc int
    DECLARE @doc varchar(1000)
    SET @doc ='
    <ROOT>
    <Customer CustomerID="VINET" ContactName="Paul Henriot">
       <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
          <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
          <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
       </Order>
    </Customer>
    <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
       <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
          <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
       </Order>
    </Customer>
    </ROOT>'
    --Create an internal representation of the XML document.
    EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc

    SELECT    *
    FROM       OPENXML (@hdoc, '/ROOT/Customer',1)
                WITH (CustomerID  varchar(10),
                      ContactName varchar(20))

    -- Remove the internal representation.
    exec sp_xml_removedocument @hdoc


    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil
    Monday, August 17, 2009 7:06 PM
  • O SQL é a versão 2008 Standart.

    vamos lá.. parte do XML é isto
     
      <?xml version="1.0" encoding="UTF-8" ?>
    - <nfeProc versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
    - <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
    - <infNFe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Id="NFe41090801483048000160550010000030230702046005" versao="1.10">
    - <ide>
      <cUF>41</cUF>
      <cNF>070204600</cNF>
      <natOp>VENDAS DE MERCADORIAS SUJEITAS A SUBSTITUICAO TRIBUTARIA</natOp>
      <indPag>1</indPag>
      <mod>55</mod>
      <serie>1</serie>
      <nNF>3023</nNF>
      <dEmi>2009-08-03</dEmi>
      <tpNF>1</tpNF>
      <cMunFG>4125506</cMunFG>
      <tpImp>1</tpImp>
      <tpEmis>1</tpEmis>
      <cDV>5</cDV>
      <tpAmb>2</tpAmb>
      <finNFe>1</finNFe>
      <procEmi>3</procEmi>
      <verProc>TESTE 1.4.0</verProc>
      </ide>


    .........

      </Signature>
      </NFe>
    + <protNFe versao="1.10">
    + <infProt Id="ID141090002298091">
      <tpAmb>2</tpAmb>
      <verAplic>v3314</verAplic>
      <chNFe>41090801483048000160550010000030230702046005</chNFe>
      <dhRecbto>2009-08-10T17:17:25</dhRecbto>
      <nProt>141090002298091</nProt>
      <digVal>ZBxVfa3A2xs7G8+xnUEm1OYd4D0=</digVal>
      <cStat>100</cStat>
      <xMotivo>Autorizado o uso de NF-e (IdNFe: NFe41090801483048000160550010000030230702046005)</xMotivo>
      </infProt>
      </protNFe>
      </nfeProc>


    Tentei ler por exemplo o campo cNF e retornou nul..

    • Edited by New Civic Monday, August 17, 2009 7:40 PM
    Monday, August 17, 2009 7:10 PM
  • e se rodo o código até a linha:

    ...
    SELECT * FROM OPENXML(@hdoc, '/nfeProc/NFe/infNFe/ide/')


    aparece várias colunas: id,parentid,nodetype,localname,prefix,namespaceuri,datatype,prev,text.... TUDO vazio..

    Não sei se tem alguma coisa a ver..

    Monday, August 17, 2009 7:16 PM
  • New Civic

    ja que vc utiliza o sql 2008, você pode usar o xQuery
    segue exemplo

    DECLARE @myDoc xml
    SET @myDoc = '<Root>
    <ProductDescription ProductID="1" ProductName="Road Bike">
    <Features>
      <Warranty>1 year parts and labor</Warranty>
      <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
    </Features>
    </ProductDescription>
    </Root>'
    
    SELECT @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int' )

    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    Monday, August 17, 2009 7:24 PM
    Moderator
  • este seu exemplo funcionou..

    porém ao aplicar meu xml dá o mesmo problema.. retorna NULL
    Monday, August 17, 2009 7:24 PM
  • ao usar XQuery retornou o seguinte erro:

    SELECT @idoc.value('(/nfeProc/NFe/infNFe/ide/@cNF)[1]', 'int' )

    Também retornou NULL

    • Edited by New Civic Monday, August 17, 2009 7:33 PM
    Monday, August 17, 2009 7:26 PM
  • assim tb retorna null

    SELECT

     

    @idoc.value('(/nfeProc/NFe/infNFe/ide/cUF)[1]', 'int' )

    mudei o exemplo que me foi passado, e funcionou:

    DECLARE

     

    @myDoc xml

    SET

     

    @myDoc = '<Root><ProductDescription ProductID="1" ProductName="Road Bike">
    <Features>
    <Warranty>1 year parts and labor</Warranty>
    <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
    </Features>
    </ProductDescription>
    </Root>'

    SELECT

     

    @myDoc.value('(/Root/ProductDescription/Features/Warranty)[1]', 'varchar(255)' )


    Então acho que o problema está na localização do nó.. vou tentar com outros nós para ver se funciona o que acham?

    Monday, August 17, 2009 7:46 PM
  • tentei pegar o nó mais baixo e tb retorna null

     

    SELECT @idoc.value('(/nfeProc/@versao)[1]', 'nvarchar(255)' ) as teste

    ou

    SELECT @idoc.value('(/nfeProc/NFe/@xmlns)[1]', 'nvarchar(255)' ) as teste


    tb não retornou nada.. nem erro e nem dados..

    Monday, August 17, 2009 8:02 PM
  • New Civic,
        Se puder, faça um teste: tire a parte xmlns="http://www.portalfiscal.inf.br/nfe" da linha NFe do seu XML e execute novamente.... 

       Estou a um tempão aqui tentando fazer funcionar, só consegui quando tirei esta informação.
    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil
    Monday, August 17, 2009 8:34 PM
  • Funcionou!!!

    Mas agora tenho duas dúvidas, para retirar esta parte do código eu não consigo fazer assim:

    SET

     

    @idoc = REPLACE(@idoc ,'xmlns="http://www.portalfiscal.inf.br/nfe','')

     

     

    Pois dá o seguinte erro:


    Msg 8116
    , Level 16, State 1, Line 33

    Argument data

    type xml is invalid for argument 1 of replace function.

     

     



    E outra este arquivo vai estar em uma pasta física, na rede, tem como pegar o texto todo do arquivo através de um BULK INSERT ou algo do genero?

    Ah... e não sei como vai ser o nome do arquivo hehe.. dificil né ???


    Obrigado desde já.

    Att
    New Civic

    Monday, August 17, 2009 8:47 PM
  • Sim, dá p/ fazer um BULK na boa.... eu faço isso em alguns arquivos XML que gero de outras aplicações.

    Para o replace, coloca teu xml em uma variavel VarChar(Max), faz o replace, depois iguala à uma variavel XML, funciona normal. eu tentei usar o modify do XML mas não consegui. ( http://msdn.microsoft.com/pt-br/library/ms190675.aspx )


    DECLARE @doc varchar(max) 
    declare @doc2 XML


    set @doc = '<?xml version=''1.0'' encoding=''UTF-8'' ?>
    <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
      <infNFe>
        <ide>
          <cUF>35</cUF>
          <cNF>518005127</cNF>
          <natOp>Venda a vista</natOp>
          <indPag>0</indPag>
          <mod>55</mod>
          <serie>1</serie>
          <nNF>1</nNF>
          <dEmi>2008-05-06</dEmi>
          <dSaiEnt>2008-05-06</dSaiEnt>
          <tpNF>0</tpNF>
          <cMunFG>3550308</cMunFG>
          <tpImp>1</tpImp>
          <tpEmis>1</tpEmis>
          <cDV>3</cDV>
          <tpAmb>2</tpAmb>
          <finNFe>1</finNFe>
          <procEmi>0</procEmi>
          <verProc>NF-eletronica.com</verProc>
        </ide>
      </infNFe>
    </NFe>'


    set @doc2 = replace(@doc,  'xmlns="http://www.portalfiscal.inf.br/nfe"', '')

    Select @doc2


    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil
    • Marked as answer by New Civic Tuesday, August 18, 2009 11:36 AM
    • Unmarked as answer by New Civic Tuesday, August 18, 2009 11:38 AM
    Monday, August 17, 2009 9:11 PM
  • Pô agora ficou mole.. mole trabalhar com XML HEHEH.. obrigado Fausto pela ajuda..

    Vou ver na web como faz o bulk insert e depois posto o código todo..

    Abraço
    New Civic
    Tuesday, August 18, 2009 11:22 AM
  • estou tentando ler o xml de uma pasta e está dando erro.

    estou usando um código que achei neste fórum:

    WITH

     

    ConsultaXML (ColunaXML)

    AS

     

    ( SELECT * FROM OPENROWSET(BULK N'C:\Documents and Settings\eu\Desktop\NFS XML AGOSTO\141090002298091_v1.10-procNFe.xml', SINGLE_BLOB) AS Document) SELECT CAST(ColunaXML AS XML) FROM ConsultaXML

    Msg 4861, Level 16, State 1, Line 1

    Cannot bulk load because the file "C:\Documents and Settings\eu\Desktop\NFS XML AGOSTO\141090002298091_v1.10-procNFe.xml" could not be opened. Operating system error code 3(failed to retrieve text for this error. Reason: 15105).





    Alguém já viu este erro?

    Tuesday, August 18, 2009 12:09 PM
  • Olá New Civic,

    Sobre qual conta o SQL Server está rodando? Acredito que o usuário do SQL Server não tem permissão de acesso nesta pasta ou o arquivo não está neste caminho.

    Abraços

    Demétrio Silva
    • Marked as answer by New Civic Tuesday, August 18, 2009 8:23 PM
    Tuesday, August 18, 2009 12:21 PM
  • Você loga no SQL-Server com Windows Authentication ou SQL Authentication ???

    Esse erro é porque seu usuário windows authentication OU o usuário que o SQL-Server está utilizando para "subir" o serviço no Windows não tem permissão para a pasta do documento.

    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil
    Tuesday, August 18, 2009 12:21 PM
  • New Civic

    error system 3, geralmente é caminho não encontrado...
    vc esta conectado em um server SQL que esta instalado na sua maquina? pq o caminho que vc esta informando ele vai pesquisar no servidor.

    compartilhe o diretorio e passe o caminho do compartilhamento \\suamaquina\pasta\arquivo

    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    • Marked as answer by New Civic Tuesday, August 18, 2009 8:23 PM
    Tuesday, August 18, 2009 12:24 PM
    Moderator
  • Estou usando o usuário SA.

    o Servidor SQL está em uma máquina e eu estou rodando na minha máquina de desenvolvimento.

    mudei o código para

    WITH

     

    ConsultaXML (ColunaXML) AS

    (

     

    SELECT * FROM OPENROWSET(BULK N'\\brsrv03\Office\Publica\xml\141090002298091_v1.10-procNFe.xml', SINGLE_BLOB) AS Document) SELECT CAST(ColunaXML AS XML) FROM ConsultaXML

    Tb deu o mesmo erro..

    tentei jogar na raiz do servidor

    WITH ConsultaXML (ColunaXML) AS

    (

     

    SELECT * FROM OPENROWSET(BULK N'C:\141090002298091_v1.10-procNFe.xml', SINGLE_BLOB) AS Document) SELECT CAST(ColunaXML AS XML) FROM ConsultaXML

    deu outro erro:

    Msg 4860, Level 16, State 1, Line 2
    Cannot bulk load. The file "C:\141090002350020_v1.10-procNFe.xml" does not exist.

     


    Tuesday, August 18, 2009 12:37 PM
  • Ah sobre o usuário eu naõ tenho certeza mas acho que é o NETWORK aquele da REDE, como faço para conferir isto?

    Abraço
    New Civic

    Tuesday, August 18, 2009 12:43 PM
  • Iniciar / SQL server / Configuration Tools / Sql Server Configuration Manager / SQL Server Services / Botão direto e propeiedades em SQL Server ( sua instancia ).

    Abraços

    Demétrio Silva
    • Marked as answer by New Civic Tuesday, August 18, 2009 8:24 PM
    Tuesday, August 18, 2009 12:46 PM
  • Está dizendo assim:

    Account Name: "AUTORIDADE NT\SERVIÇO DE REDE"

    Acha que pode ser este usuário???

    Abraço
    new Civic
    Tuesday, August 18, 2009 12:57 PM
  • puxa vida pessoal, foi mau..

    eu estava no servidor errado.. temos dois servidores sql..

    assim funcionou:

    DECLARE

     

    @doc varchar(max)
    DEclare @doc2 XML
    WITH
    ConsultaXML (ColunaXML) AS
    ( SELECT * FROM OPENROWSET(BULK N'C:\141090002298091_v1.10-procNFe.xml', SINGLE_BLOB) AS Document)

    SELECT
    @doc = CAST(ColunaXML AS varchar(max)) FROM ConsultaXML
    set @doc2 = replace(@doc, 'xmlns="http://www.portalfiscal.inf.br/nfe"', '')

    SELECT

     

    @doc2

    .value('(/nfeProc/NFe/infNFe/ide/cNF)[1]', 'varchar(50)' ),

    @doc2

    .value('(/nfeProc/NFe/infNFe/ide/serie)[1]', 'int' ),

    @doc2

    .value('(/nfeProc/NFe/infNFe/ide/dEmi)[1]', 'datetime' ),

    @doc2

    .value('(/nfeProc/NFe/infNFe/dest/CNPJ)[1]', 'varchar(50)' ),

    @doc2

    .value('(/nfeProc/NFe/infNFe/dest/xNome)[1]', 'varchar(100)' )

     

    Mas tenho dois problemas então.. se não funciona o \\maquinarede\ vou ter que criar uma pasta no servidor para estes xmls..

    A segunda é que eu não sei o nome do arquivo.. como faço para listar o arquivo?
    existe algum dir c:\*.*  ????? hehhe..



     

     

    Tuesday, August 18, 2009 1:11 PM
  • Até tem.... usando o xp_cmdshell...

    A grosso modo a "gambi" é +/- assim:

    Drop Table #Arquivos

    CREATE TABLE #Arquivos (FileName1 varchar (255))

    INSERT INTO #Arquivos(FileName1) Exec master.dbo.xp_cmdshell 'dir c:\'

    DELETE
    FROM   #Arquivos
    WHERE  FileName1 NOT LIKE '[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] %'
    OR FileName1 LIKE '%<DIR>%'
    OR FileName1 is null

    SELECT
      FileName = REVERSE( LEFT(REVERSE(FileName1),CHARINDEX(' ',REVERSE(FileName1))-1 ) ),
      CreateDate = LEFT(FileName1,10)
    FROM #Arquivos
    ORDER BY FileName




    Eu particularmente não gosto disso.... aqui nos precisamos fazer algo igual.... só que pedi aos programadores .Net fazerem um serviço no windows utilizando o FileSystemWatcher... assim sempre que um arquivo xml terminar de ser gravado, ele valida o nome e chama uma Stored Procedure no banco passando a pasta\nome no arquivo.... Dessa forma eu não preciso ter nada no banco monitorando...


    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil
    Tuesday, August 18, 2009 1:27 PM
  • então... funcionou..

    pelo menos por enquanto vou fazer este cháxo..

    DECLARE @ARQUIVO varchar(255)
    DECLARE @PASTA varchar(255)
    DECLARE @SqlString varchar(4000)

    DECLARE @doc varchar(max)
    DEclare @doc2 XML


    SET @PASTA = 'C:\'

    Drop Table #Arquivos
    CREATE TABLE #Arquivos (arquivo varchar (255))
    INSERT INTO #Arquivos (arquivo) Exec master.dbo.xp_cmdshell 'dir C:\*.xml /b'
    SELECT top 1 @ARQUIVO=arquivo FROM #Arquivos

     
    Set @SqlString = 'SELECT * FROM OPENROWSET(BULK N'''+ @PASTA + @ARQUIVO + ''')'
    print @SqlString
    WITH ConsultaXML (ColunaXML) AS ( exec(@SqlString) , SINGLE_BLOB ) as Document
    SELECT @doc=CAST(ColunaXML AS varchar(max)) FROM ConsultaXML

     

     



    O PRINT QUE FIZ RETORNA ASSIM:

    SELECT * FROM OPENROWSET(BULK N'C:\141090002298091_v1.10-procNFe.xml')

    não tá certo????

    Abraço
    New Civic

    @doc=CAST(ColunaXML AS varchar(max)) FROM ConsultaXML

    Dá o erro:

    Msg 319, Level 15, State 1, Line 21
    onsultaXML (ColunaXML) AS ( exec(@SqlString) , SINGLE_BLOB ) as Document
    @SqlString
    top 1 @ARQUIVO=arquivo FROM #Arquivos Set @SqlString = 'SELECT * FROM OPENROWSET(BULK N'''+ @PASTA + @ARQUIVO + ''')'
    NTO #Arquivos (arquivo) Exec master.dbo.xp_cmdshell 'dir C:\*.xml /b'
    TABLE #Arquivos (arquivo varchar (255))
    Table #Arquivos
    top 1 @ARQUIVO=arquivo FROM #Arquivos


    Porém estou tentando implementar no código e não consigo..

    INTO #Arquivos (arquivo) Exec master.dbo.xp_cmdshell 'dir C:\*.xml /b'
    TABLE #Arquivos (arquivo varchar (255))
    Table #Arquivos
    @ARQUIVOvarchar(255)
    DECLARE @PASTA varchar(255) SET @PASTA= 'C:\'
    • Edited by New Civic Tuesday, August 18, 2009 2:12 PM
    Tuesday, August 18, 2009 2:08 PM
  • O que retorna de erro no codigo?
    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil
    Tuesday, August 18, 2009 2:13 PM
  • ah desculpa não colou o erro:

    Msg 319, Level 15, State 1, Line 21
    Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
    Msg 102, Level 15, State 1, Line 21
    Incorrect syntax near ','.
    Tuesday, August 18, 2009 2:22 PM
  • A sintaxe do Bulk está errada E de qualquer forma não dá p/ você fazer um "Select" de um exec no caso da CTE.

    Após algumas brigas com o Encoding segue uma sugestão:

    DECLARE @ARQUIVO varchar(255)
    DECLARE @PASTA varchar(255)
    DECLARE @SqlString varchar(4000)

    DECLARE @doc varchar(max)
    DEclare @doc2 XML

    SET @PASTA = 'C:\'

    Drop Table #Arquivos
    CREATE TABLE #Arquivos (arquivo varchar (255))
    INSERT INTO #Arquivos (arquivo) Exec master.dbo.xp_cmdshell 'dir C:\*.xml /b'

    SELECT top 1 @ARQUIVO=arquivo FROM #Arquivos

    Create Table #tmpLista (xCol NVarChar(max))
    --
    Set @SqlString = 'Insert Into #tmpLista(xCol)
    SELECT cast(BulkColumn as NVarchar(max))
         FROM OPENROWSET (BULK '''+ @PASTA + @ARQUIVO + ''', SINGLE_BLOB) AS xCol'
     
    Execute(@SqlString)

    Update #tmpLista set xCol = replace(xCol,  'xmlns="http://www.portalfiscal.inf.br/nfe"', '')
    Update #tmpLista set xCol = replace(xCol,  'encoding="UTF-8"', '')

    Select cast(xCol as XML) from #tmpLista

    Drop TABLE #tmpLista


    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil
    • Marked as answer by New Civic Tuesday, August 18, 2009 6:00 PM
    Tuesday, August 18, 2009 4:44 PM
  • Então Fausto, funcionou.. 

    porém tá vindo tudo null..

    fiz assim:





    DECLARE @ARQUIVO varchar(255)
    DECLARE @PASTA varchar(255)
    DECLARE @SqlString varchar(4000)

    DECLARE @doc varchar(max) 
    DEclare @doc2 XML

    SET @PASTA = 'C:\'

    Drop Table #Arquivos
    CREATE TABLE #Arquivos (arquivo varchar (255))
    INSERT INTO #Arquivos (arquivo) Exec master.dbo.xp_cmdshell 'dir C:\*.xml /b'

    SELECT top 1 @ARQUIVO=arquivo FROM #Arquivos


    Create Table #tmpLista (xCol NVarChar(max))

    Set @SqlString = 'Insert Into #tmpLista(xCol)
    SELECT cast(BulkColumn as NVarchar(max)) 
         FROM OPENROWSET (BULK '''+ @PASTA + @ARQUIVO + ''', SINGLE_BLOB) AS xCol'
     
    Execute(@SqlString)

    Update #tmpLista set xCol = replace(xCol,  'xmlns="http://www.portalfiscal.inf.br/nfe"', '')
    Update #tmpLista set xCol = replace(xCol,  'encoding="UTF-8"', '')


    Select @doc2=cast(xCol as XML) from #tmpLista

    SELECT 
    @doc2.value('(/nfeProc/NFe/infNFe/ide/cNF)[1]', 'varchar(50)' ),
    @doc2.value('(/nfeProc/NFe/infNFe/ide/serie)[1]', 'int' ),
    @doc2.value('(/nfeProc/NFe/infNFe/ide/dEmi)[1]', 'datetime' ),
    @doc2.value('(/nfeProc/NFe/infNFe/dest/CNPJ)[1]', 'varchar(50)' ),
    @doc2.value('(/nfeProc/NFe/infNFe/dest/xNome)[1]', 'varchar(100)' )


     Drop TABLE #tmpLista
     
     

    Tem como fazer um print ou algo assim para saber o que está acontecendo?

    pois fis select * FROM #tmpLista e retornou assim:

    㼼浸敶獲潩㵮ㄢ〮•湥潣楤杮∽呕ⵆ∸㸿渼敦牐捯瘠牥慳㵯ㄢ


    Abraço
    New Civic
    Tuesday, August 18, 2009 5:44 PM
  • hehe.. mudei o campo da tabela #tmpLista para varchar e retornou assim:

    ?????????•????????????????????????????????????????????????????????????????????????????????????????????????•?????????????????????????????????????????????????????????????????????????????


    Tuesday, August 18, 2009 5:52 PM
  • o problema estava no tipo.. mudei para isto funcionou...





    DECLARE @ARQUIVO varchar(255)
    DECLARE @PASTA varchar(255)
    DECLARE @SqlString varchar(4000)

    DECLARE @doc varchar(max) 
    DEclare @doc2 XML

    SET @PASTA = 'C:\'

    Drop Table #Arquivos
    CREATE TABLE #Arquivos (arquivo varchar (255))

    INSERT INTO #Arquivos (arquivo) Exec master.dbo.xp_cmdshell 'dir C:\*.xml /b'
    SELECT top 1 @ARQUIVO=arquivo FROM #Arquivos


    Create Table #tmpLista (xCol XML)
    Set @SqlString = 'Insert Into #tmpLista(xCol)
    SELECT cast(BulkColumn as XML) 
         FROM OPENROWSET (BULK '''+ @PASTA + @ARQUIVO + ''', SINGLE_BLOB) AS xCol'
     
    Execute(@SqlString)

    --Update #tmpLista set xCol = replace(xCol,  'xmlns="http://www.portalfiscal.inf.br/nfe"', '')
    --Update #tmpLista set xCol = replace(xCol,  'encoding="UTF-8"', '')

    select * from #tmpLista

    SELECT @doc=CAST(xCol AS varchar(max)) FROM #tmpLista
    set @doc2 = replace(@doc,  'xmlns="http://www.portalfiscal.inf.br/nfe"', '')
    SELECT 
    @doc2.value('(/nfeProc/NFe/infNFe/ide/cNF)[1]', 'varchar(50)' ),
    @doc2.value('(/nfeProc/NFe/infNFe/ide/serie)[1]', 'int' ),
    @doc2.value('(/nfeProc/NFe/infNFe/ide/dEmi)[1]', 'datetime' ),
    @doc2.value('(/nfeProc/NFe/infNFe/dest/CNPJ)[1]', 'varchar(50)' ),
    @doc2.value('(/nfeProc/NFe/infNFe/dest/xNome)[1]', 'varchar(100)' )


     Drop TABLE #tmpLista
     
     


    AcHO QUE É ISTO.. OBRIGADO FAUSTO, muito obrigado mesmo..!!!
    Tuesday, August 18, 2009 5:59 PM
  • Legal... não esqueça de marcar como respostas tambem as respostas do Marcelo e do Demetrio.
    Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil
    Tuesday, August 18, 2009 6:52 PM