none
BULK INSERT RRS feed

  • Pergunta

  • Boa tarde galera, tudo bem?

    Bom, estou com o seguinte problema:

    Tenho um arquivo .txt que contém este conteúdo:

    (3056,1,'65636','536','65636','599'),(3056,2,'65636','600','65636','659')......

    A estrutura da minha tabela é esta:

        [bai_nu_sequencial] [bigint] NOT NULL,
        [fcb_nu_ordem] [bigint] NOT NULL,
        [fcb_rad_ini] [varchar](5) NOT NULL,
        [fcb_suf_ini] [varchar](3) NOT NULL,
        [fcb_rad_fim] [varchar](5) NOT NULL,
        [fcb_suf_fim] [varchar](3) NOT NULL

    Agora a pergunta, como faria para fazer um insert usando o BULK INSERT?

    Tentei fazer assim mas deu erro:

    BULK INSERT teste_arquivo FROM 'C:\andre\TESTE.txt' WITH (FIELDTERMINATOR = ')' )

    Se alguem puder me ajudar, fico no aguardo!

    Abraços...


    Andre Andriotti

    quarta-feira, 28 de janeiro de 2015 15:29

Respostas

  • Andriotti,

    Você pode utilizar "OPENROWSET" para importar essa "massa" de dados e depois usando uma tabela temporária você pode ajustar às informações de acordo com sua necessidade para posterior uso de um ou mais sistemas.

    Segue um exemplo que criei com base "em parte" das suas informações (por favor, adapte às suas necessidades):

    - Crieu um arquivo .txt como 2 linhas de registros;

    Arquivo "teste.txt"

    (3056,1,'65636','536','65636','599'),(3056,2,'65636','600','65636','659')
    (1234,2,'123','123','123','123'),(4321,1,'321','321','321','321')

    - Crieu um arquivo de formatação .fmt com o lay-out utilizando o separador ")," para às colunas e "\r\n" para "quebra de linha", como indicado abaixo:

    Arquivo "formato.fmt"

    11.0
    2
    1       SQLCHAR       0       1000     "),"      1     Col1         ""
    2       SQLCHAR       0       1000     "\r\n"    2     Col2         ""

    À seguir construi o script para efetuar a carga usando OPENROWSET, veja:

    T-SQL:

    --DROP TABLE #TB_AUX
    
    SELECT TXT.* 
    INTO #TB_AUX
    FROM OPENROWSET( BULK 'e:\temp\teste.txt', 
       FORMATFILE = 'e:\temp\formato.fmt') AS TXT;
    
    SELECT
    	REPLACE(COL1, '(','') AS Coluna1,
    	REPLACE(REPLACE(COL2, '(',''), ')','') AS Coluna1
    FROM #TB_AUX
    GO


    Segue um print como Evidência de Teste:

    Para finalizar, eu apenas removi os parênteses utilizando a função REPLACE.

    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms178129.aspx

    https://msdn.microsoft.com/pt-br/library/ms191479.aspx

    https://msdn.microsoft.com/pt-br/library/ms186335.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Marcado como Resposta Andriotti quinta-feira, 29 de janeiro de 2015 18:50
    quinta-feira, 29 de janeiro de 2015 16:02
    Moderador

Todas as Respostas

  • André

    acho que seria mais rápido se você alterar o .TXT, faz um replace de ( para "nada" e de ) para ";" e usa o ; como fieldterminator.

    Caso o txt seja recorrente, acredito que seria mais simples alterar o gerador do txt (se possível), caso contrario  você deverá fazer retalhos no seu script SQL que depednendo a volumetria pode comprometer sua performance.


    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS, MCITP, MCT e MVP.
    Se Útil, classifique!!!
    Me siga no twitter: @marcelodba

    quarta-feira, 28 de janeiro de 2015 16:13
  • Obrigado pela ajuda Marcelo, mas neste caso não será possível, pois o arquivo tem muito dados.

    Só pra vc ter uma ideia, o meu arquivo .txt está com 365MB. Se eu fizer o replace como sugerido, não vou ter memória o suficiente para processar. Mas mesmo assim muito obrigado pela ajuda.

    Abraços.


    Andre Andriotti

    quarta-feira, 28 de janeiro de 2015 16:58
  • Andriotti,

    Você pode utilizar "OPENROWSET" para importar essa "massa" de dados e depois usando uma tabela temporária você pode ajustar às informações de acordo com sua necessidade para posterior uso de um ou mais sistemas.

    Segue um exemplo que criei com base "em parte" das suas informações (por favor, adapte às suas necessidades):

    - Crieu um arquivo .txt como 2 linhas de registros;

    Arquivo "teste.txt"

    (3056,1,'65636','536','65636','599'),(3056,2,'65636','600','65636','659')
    (1234,2,'123','123','123','123'),(4321,1,'321','321','321','321')

    - Crieu um arquivo de formatação .fmt com o lay-out utilizando o separador ")," para às colunas e "\r\n" para "quebra de linha", como indicado abaixo:

    Arquivo "formato.fmt"

    11.0
    2
    1       SQLCHAR       0       1000     "),"      1     Col1         ""
    2       SQLCHAR       0       1000     "\r\n"    2     Col2         ""

    À seguir construi o script para efetuar a carga usando OPENROWSET, veja:

    T-SQL:

    --DROP TABLE #TB_AUX
    
    SELECT TXT.* 
    INTO #TB_AUX
    FROM OPENROWSET( BULK 'e:\temp\teste.txt', 
       FORMATFILE = 'e:\temp\formato.fmt') AS TXT;
    
    SELECT
    	REPLACE(COL1, '(','') AS Coluna1,
    	REPLACE(REPLACE(COL2, '(',''), ')','') AS Coluna1
    FROM #TB_AUX
    GO


    Segue um print como Evidência de Teste:

    Para finalizar, eu apenas removi os parênteses utilizando a função REPLACE.

    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms178129.aspx

    https://msdn.microsoft.com/pt-br/library/ms191479.aspx

    https://msdn.microsoft.com/pt-br/library/ms186335.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    • Marcado como Resposta Andriotti quinta-feira, 29 de janeiro de 2015 18:50
    quinta-feira, 29 de janeiro de 2015 16:02
    Moderador
  • Muito obrigado Durval.

    Consegui fazer a importação com algumas adaptações com a ajuda que vc me deu.

    Parabéns pelo jeito que vc ajuda a gente aqui no fórum.

    Abraços.


    Andre Andriotti

    quinta-feira, 29 de janeiro de 2015 18:52