Extraindo informações de arquivo XML para o SQL Server

Todos os direitos são reservado aos autores dos artigos e posts, abaixo segue uma lista de links, categorizada por assunto, que redireciona ao site ou blog do respectivo autor.

Ola galera,
Esta semana precisei importar um arquivo XML para o SQL Server, pesquisei em diversos sites, blogs e cheguei ao seguinte…
Vou colocar um exemplo e citar algumas dificuldades que tive:

arquivo: AAS.xml (exemplo do arquivo XML)

http://www.portalfiscal.inf.br/nfe” versao=”2.00″>
http://www.portalfiscal.inf.br/nfe”>

 

 

 

 

arquivo: AAS.sql (Consulta utilizada)

DECLARE @XML XML
SET @XML = (
SELECT CAST(BulkColumn AS XML)
FROM OPENROWSET(BULK N’C:\AAS.xml’, SINGLE_BLOB) — Informe onde se encontra o arquivo XML
AS Arquivo)

;WITH XMLNAMESPACES(DEFAULT ‘http://www.portalfiscal.inf.br/nfe’) — Este ponto deve ser informado o NAMESPACE (xmlns), senão informar esta linha ele não retorna.
SELECT
NFe.value(‘cUF[1]’, ‘int’) AS cUF
,      NFe.value(‘cNF[1]’, ‘int’) AS cNF
,      NFe.value(‘../emit[1]/CNPJ[1]’,’varchar(20)’) AS CNPJ
,      NFe.value(‘../emit[1]/enderEmit[1]/xLgr[1]’,’varchar(max)’) AS xLgr
,      NFe.value(‘../emit[1]/enderEmit[1]/nro[1]’,’varchar(50)’) AS nro
,      NFe.value(‘../emit[1]/enderEmit[1]/xBairro[1]’,’varchar(max)’) AS xBairro
FROM @XML.nodes(‘//infNFe/ide‘) AS NFes(NFe) — Caminho que ira iniciar a varredura

Resultado:

Alguns Links auxiliares

Como importar arquivos XML para o SQL Server – Parte i

Manipulação de XML

Iniciando com XQUERY – NameSpaces tem Solução

Baixar arquivos utilizados

Vejam também:

Gerando XML no SQL Server

Manipulação de XML com SQL Server 2008 R2 (Youtube)

Gerando XML no SQL Server – Arte do FOR XML AUTO

Gerando XML no SQL Server – Arte do FOR XML EXPLICIT

Gerando XML no SQL Server – Arte do FOR XML RAW

Gerando XML no SQL Server – Arte do FOR XML PATH

Iniciando com XQuery – Resumo

Como atribuir a uma variável no SQL Server, o valor de uma consulta FOR XML
Alex Souza
L&AConsultoria - Logo

Anúncios

18 comentários em “Extraindo informações de arquivo XML para o SQL Server

  1. Alex,
    Preciso muito da rotina completa de leitura dos itens e impostos da NFe. Voce possui? Pode ser via venda, doação, emprestimo, etc

  2. Ola Alex, boa tarde.
    Gostaria de uma ajuda sua para buscar os produtos usando a mesma query que voce esta usando é possivel?

  3. Imports System.Xml
    Imports System.IO

    Public Class Form1
    Dim strNomeArquivo As String = “”
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ‘###################### File dialog

    Try
    Dim myStream As Stream = Nothing
    Dim openFileDialog1 As New OpenFileDialog()

    openFileDialog1.InitialDirectory = “c:\”
    openFileDialog1.Filter = “xml files (*.xml)|*.xsd|Todos os Arquivos (*.*)|*.*”
    openFileDialog1.FilterIndex = 2
    openFileDialog1.RestoreDirectory = True

    If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
    Try
    myStream = openFileDialog1.OpenFile()
    strNomeArquivo = openFileDialog1.FileName
    MsgBox(strNomeArquivo)
    If (myStream IsNot Nothing) Then
    ‘ Insert code to read the stream here.
    End If
    Catch Ex As Exception
    MessageBox.Show(“Cannot read file from disk. Original error: ” & Ex.Message)
    Finally
    ‘ Check this again, since we need to make sure we didn’t throw an exception on open.
    If (myStream IsNot Nothing) Then
    myStream.Close()
    End If
    End Try
    End If

    If strNomeArquivo “” Then

    ‘###################### classe xml
    Dim xmlDoc As New XmlDocument
    xmlDoc.Load(strNomeArquivo) ‘LOCAL DO ARQUIVO

    Dim ns As New XmlNamespaceManager(xmlDoc.NameTable)
    Dim nrNFE As New XmlNamespaceManager(xmlDoc.NameTable)
    ns.AddNamespace(“nfe”, “http://www.portalfiscal.inf.br/nfe”)
    nrNFE.AddNamespace(“protNFe”, “http://www.portalfiscal.inf.br/nfe”)

    ‘ <protNFe versao="2.00"

    '
    ‘ 1
    ‘ SVRS20130709084954
    ‘ 33130702886533000148550010001888011480653418

    txtNFE.Text = xmlDoc.SelectSingleNode(“//protNFe:chNFe”, nrNFE).InnerText ‘ AQUI PEGO O NÚMERO DA NFE
    txtCNPJ.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:CNPJ”, ns).InnerText ‘ AQUI PEGO O CNPJ
    txtInscEstadual.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:IE”, ns).InnerText ‘ AQUI PEGO O ENDERECO
    txtFornecedor.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:xNome”, ns).InnerText ‘ AQUI PEGO A RAZAO SOCIAL
    txtFantasia.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:xFant”, ns).InnerText ‘ AQUI PEGO O NOME FANTASIA
    txtEndereco.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:enderEmit/nfe:xLgr”, ns).InnerText ‘ AQUI PEGO O ENDERECO
    txtNumero.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:enderEmit/nfe:nro”, ns).InnerText ‘ AQUI PEGO O ENDERECO
    txtCodMunicipio.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:enderEmit/nfe:cMun”, ns).InnerText ‘ AQUI PEGO O ENDERECO
    txtMunicipio.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:enderEmit/nfe:xMun”, ns).InnerText ‘ AQUI PEGO O ENDERECO
    txtUF.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:enderEmit/nfe:UF”, ns).InnerText ‘ AQUI PEGO O ENDERECO
    txtCEP.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:enderEmit/nfe:CEP”, ns).InnerText ‘ AQUI PEGO O ENDERECO
    txtCodPais.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:enderEmit/nfe:cPais”, ns).InnerText ‘ AQUI PEGO O ENDERECO
    txtPais.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:enderEmit/nfe:xPais”, ns).InnerText ‘ AQUI PEGO O ENDERECO
    txtTelefone.Text = xmlDoc.SelectSingleNode(“//nfe:infNFe/nfe:emit/nfe:enderEmit/nfe:fone”, ns).InnerText ‘ AQUI PEGO O ENDERECO

    End If

    Catch ex As Exception

    End Try

    End Sub

    End Class

  4. Preciso de uma Query para ler a TAG dos produtos. Quando executo o comando a baixo, retorna tudo NULL

    DECLARE @XML XML
    SET @XML = (
    SELECT CAST(BulkColumn AS XML)
    FROM OPENROWSET(BULK N’D:\12836.xml’, SINGLE_BLOB) — Informe onde se encontra o arquivo XML
    AS Arquivo)

    ;WITH XMLNAMESPACES(DEFAULT ‘http://www.portalfiscal.inf.br/nfe’) — Este ponto deve ser informado o NAMESPACE (xmlns)

    SELECT
    NFe.value(‘vProd[1]’, ‘float’) AS vprod,
    NFe.value(‘xProd[1]’, ‘varchar(max)’) AS xprod
    FROM @XML.nodes(‘//infNFe/det’) AS NFes(NFe) — Caminho que ira iniciar a varredura

    Alguém pode me ajudar a resolver esse problema.
    Bem simples o comando que nosso amigo Alex Souza nos apresentou. Se possível, me ajudem dentro desta estrutura. Obrigado a todos.

    1. Boa Tarde Eduardo.

      Li o seu post hoje, pois também tenho a mesma necessidade, gostaria de saber se conseguiu uma solução. que poderia compartilhar

      1. Não, ainda não consegui e nem a comunidade postou algo! Vou dar mais uma procurada e qualquer coisa posto aqui! Abraço!

        Agradeço pelo acesso! Divulgue o blog para seus contatos!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s