none
Bulk Insert com arquivo sem delimitador RRS feed

  • Pergunta

  • Olá pessoal

    Estou com um problema:Tenho um arquivo txt nessa estrutura

    20110000000003600,00Emissão de Empenho Orçamentário.

    E na documentação, ele especifica que da posição 1 até a 4 é o campo VIGÊNCIA. Da 5 à 16 VALOR e da 17 ao fim, a DESCRICAO.

    Como vou usar os delimitadores do bulk insert neste caso?Já que ele vai ter que definir de onde até onde é o primeiro campo, e assim por diante?

    A tabela já está criado com os campos certinhos.

    Nunca usei BULK e nem sei se é a melhor opção.

    Alguém ajuda?


    Alessandra Regina

    quinta-feira, 1 de março de 2012 21:08

Respostas

  • Olá MSPAlessandra,

    Creio que isto irá resolver seu problema.

    para o teste alimente um arquivo BULK_TESTE.TXT com o seguinte texto:

    20110000000003600,00Emissão de Empenho Orçamentário
    20110000000003600,00TESTE
    20110000000003600,00TESTE2

    IF EXISTS (SELECT NAME FROM TEMPDB.SYS.tables WHERE name LIKE '#TEMP_BULK%')
    	DROP TABLE #TEMP_BULK
    CREATE TABLE #TEMP_BULK(TEXTO VARCHAR(100))
    GO
    BULK INSERT #TEMP_BULK FROM	'C:\BULK_TESTE.txt'
    GO
    ALTER TABLE #TEMP_BULK ADD ID INT IDENTITY(1,1)
    GO
    SELECT
    	SUBSTRING(TEXTO,1,4)AS VIGENCIA
    	,SUBSTRING(TEXTO,5,16) AS VALOR
    	,SUBSTRING(TEXTO,21,LEN(TEXTO)) AS DESCRICAO
    FROM #TEMP_BULK

    delimitações: Você terá de faze-las na mão, através do comando SUBSTRING. Conforme o exemplo acima.

    Abraços;

    Se útil, Classifique!


    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com

    • Sugerido como Resposta Eder Costa terça-feira, 6 de março de 2012 16:49
    • Marcado como Resposta MSPAlessandra terça-feira, 6 de março de 2012 23:55
    sexta-feira, 2 de março de 2012 15:23

Todas as Respostas

  • Olá MSPAlessandra,

    Realmente você não conseguirá fazer isto diretamente pelo Bulk Insert. Que tal, usa-lo apenas para importar os dados do txt para uma tabela no SQL, e então tratar os registros com T-SQL?

    Segue um exemplo, que deverá ser aplicado depois de importar os dados:

    DECLARE @VARIAVEL VARCHAR(100) = '20110000000003600,00Emissão de Empenho Orçamentário.'
    SELECT
    	SUBSTRING(@VARIAVEL,1,4)AS VIGENCIA
    	,SUBSTRING(@VARIAVEL,5,16) AS VALOR
    	,SUBSTRING(@VARIAVEL,21,LEN(@VARIAVEL)) AS DESCRICAO

    abraços.

    Se útil, Classifique,


    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com


    • Editado DhiegoPiroto sexta-feira, 2 de março de 2012 03:10
    sexta-feira, 2 de março de 2012 03:09
  • Oi Dhiego bom dia.....

    Eu entendi, que pena que não dá pra fazer com bulk...Mas no meu pouco conhecimento...Como vou fazer o sql ler um arquivo txt linha por linha, porque na verdade, eu só coloquei um exemplo, mas são muitas colunas, e o arquivo é gigantesco.

    Na minha idéia, eu vou ter que ver quantas linhas tem o arquivo e pra cada uma, fazer as regrinhas de posição e ir dando insert até que acabe o arquivo. Dever ser algo como EOF, não sei realmente como fazer isso....Se puder me dar uma luz...

    Obrigada


    Alessandra Regina

    sexta-feira, 2 de março de 2012 12:10
  • Olá MSPAlessandra,

    Por quê não pode ser feito pelo Bulk? Você pode importa-lo e processa-lo linha a linha, isto seria um cursor em SQL ( query.eof em linguagens de programação ).

    Mas, se todo o arquivo estiver no formato que você enviou creio que o comando que te enviei acima atenderá as suas necessidades.

    De uma olhada neste tópico:

    http://social.technet.microsoft.com/Forums/pt-BR/admingeralpt/thread/40451124-fea2-417f-85e5-7057a486b797/#a75535a7-d926-42bd-b905-e6fe5db3db00

    Abraços.

    Se útil, Classifique.



    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com

    sexta-feira, 2 de março de 2012 12:36
  • Alessandra, bom dia,

    Vc pode utilizar o wizard import/export do próprio SQL para importar o arquivo.

    Se estiver usando o versão do SQL 2005/2008, clique com o botão direito no banco que deseja importar o arquivo --> Tasks --> Import Data.. nos passos seguintes vc configurará em que formato está o arquivo. É super simples de usar.

    Adicionamente, vc pode utilizar o SSIS para a importação deste arquivo. Essa ferramenta está disponível apenas nas edições DataCenter e Enterprise do SQL. A diferença é que vc poderá utilizar as vastas opções de transformação de dados que o SSIS possui.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    • Sugerido como Resposta Eder Costa terça-feira, 6 de março de 2012 16:49
    sexta-feira, 2 de março de 2012 12:44
  • Sim Eduardo

    Mas meu problema está em o arquivo nao ter delimitação, vou tentar delimitar pelo Excel na opção de Dados e depois fazer isso....Realmente parece mais simples


    Alessandra Regina

    sexta-feira, 2 de março de 2012 14:50
  • Alessandra, tanto o wizard como SSIS importa arquivos com tamanho de coluna fixa.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    sexta-feira, 2 de março de 2012 15:19
  • Olá MSPAlessandra,

    Creio que isto irá resolver seu problema.

    para o teste alimente um arquivo BULK_TESTE.TXT com o seguinte texto:

    20110000000003600,00Emissão de Empenho Orçamentário
    20110000000003600,00TESTE
    20110000000003600,00TESTE2

    IF EXISTS (SELECT NAME FROM TEMPDB.SYS.tables WHERE name LIKE '#TEMP_BULK%')
    	DROP TABLE #TEMP_BULK
    CREATE TABLE #TEMP_BULK(TEXTO VARCHAR(100))
    GO
    BULK INSERT #TEMP_BULK FROM	'C:\BULK_TESTE.txt'
    GO
    ALTER TABLE #TEMP_BULK ADD ID INT IDENTITY(1,1)
    GO
    SELECT
    	SUBSTRING(TEXTO,1,4)AS VIGENCIA
    	,SUBSTRING(TEXTO,5,16) AS VALOR
    	,SUBSTRING(TEXTO,21,LEN(TEXTO)) AS DESCRICAO
    FROM #TEMP_BULK

    delimitações: Você terá de faze-las na mão, através do comando SUBSTRING. Conforme o exemplo acima.

    Abraços;

    Se útil, Classifique!


    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com

    • Sugerido como Resposta Eder Costa terça-feira, 6 de março de 2012 16:49
    • Marcado como Resposta MSPAlessandra terça-feira, 6 de março de 2012 23:55
    sexta-feira, 2 de março de 2012 15:23
  • Olá Dhiego, a tua dica me ajudou e muito mesmo...há tempos que eu procurava algo sobre importação sem uma estrutura padrão ou tabulação, pois, no meu caso o sistema ao qual eu exportava o arquivo txt. Vinham varios tipos de registros em um mesmo arquivo e com isso eu não conseguia fazer o Import and Export do SQL, e com esta sua dica vc me salvou de verdade. Parabens.
    sexta-feira, 13 de julho de 2012 14:51