Usuário com melhor resposta
Bulk Insert com arquivo sem delimitador

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
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,00TESTE2IF 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
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
-
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
-
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:
Abraços.
Se útil, Classifique.
Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com
-
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
-
-
-
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,00TESTE2IF 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
-
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.