Neste artigo vou importar um arquivo csv para uma tabela com um campo IDENTITY e
um campo tipo moeda.
Utilizo para campo tipo moeda [valor] DECIMAL(18, 2), -- DECIMAL com 18 dígitos e 2 casas decimais
Com isso vamos ter facilidade para rodar em Mysql e ou Sql Server
Fico devendo o tratamento de data, algum dia tipo que tenha um tempinho vou reescrever este artigo,
colocando o campo data e seus devidos cuidados.
/* VAMOS IMPORTA UM ARQUIVO CSV/TEXTO PARA UMA TABELA.
EMBORA JÁ TENHA ESCRITO ALGUNS ARTIGOS VAMOS REVER ALGUMAS BOAS PRATICAS.
1.) Vamos criar a tabela final do processo note que essa tabela tem um campo com IDENTITY :
CREATE TABLE CONTROL_EQUIPAMENTOS
(
[id] [int] IDENTITY(1,1) NOT NULL,
[patrimonio] VARCHAR(12),
[equipamento] VARCHAR(16),
[fabricante] VARCHAR(10),
[modelo] VARCHAR(20),
[acessorio] VARCHAR(25),
[n_s] VARCHAR(22),
-- [valor] MONEY,
[valor] DECIMAL(18, 2), -- DECIMAL com 18 dígitos e 2 casas decimais
[status] VARCHAR(10)
);
2.) Vamos criar a tabela de auxilio bem parecida com a tabela CONTROL_EQUIPAMENTOS:
CREATE TABLE aux_importacao
(
[patrimonio] VARCHAR(12),
[equipamento] VARCHAR(16),
[fabricante] VARCHAR(10),
[modelo] VARCHAR(20),
[acessorio] VARCHAR(25),
[n_s] VARCHAR(22),
[valor] VARCHAR(22),
[status] VARCHAR(10)
);
OBSERVACAO
Caso não saiba o tamanho dos campos defina tudo no maximo achismos
em seguida descubra o tamanho dos campos com a funcao DATALENGTH
exemplo :
SELECT DATALENGTH([Patrimonio]) = 12
,DATALENGTH([Equipamento]) = 16
,DATALENGTH([Fabricante]) =10
,DATALENGTH([Modelo]) = 20
,DATALENGTH([Acessorio]) = 25
,DATALENGTH([N S]) = 22
,DATALENGTH([Valor]) = 11
,DATALENGTH([Status]) = 10
FROM [HOMOLOGA].[dbo].[SisCust]
*/
-- BULK INSERT para aux_importacao
-- observacao
-- CODEPAGE = '65001' e não CODEPAGE = 'ACP' devido acentuação
BULK INSERT aux_importacao
FROM 'Z:\Backup\SisCust.csv'
WITH (
FIRSTROW = 2, -- A primeira linha contém os nomes das colunas, então pulamos ela
FIELDTERMINATOR = ';', -- O separador no arquivo é uma vírgula
ROWTERMINATOR = '\n', -- O terminador de linha é uma quebra de linha
CODEPAGE = '65001'
);
select * from aux_importacao
-- truncate table aux_importacao ( se de erro )
-- Atualiza os valores DECIMAL para usar o ponto decimal
-- Estou fazendo varias trocas para demonstracao
UPDATE aux_importacao SET Valor = REPLACE(Valor, ',', 'A');
UPDATE aux_importacao SET Valor = REPLACE(Valor, '.', 'B');
select * from aux_importacao
UPDATE aux_importacao SET Valor = REPLACE(Valor, 'B', ',');
UPDATE aux_importacao SET Valor = REPLACE(Valor, 'A', '.');
select * from aux_importacao
UPDATE aux_importacao SET Valor = REPLACE(Valor, ',', '');
select * from aux_importacao
-- Exibe os dados importados
INSERT INTO CONTROL_EQUIPAMENTOS (
[patrimonio],
[equipamento],
[fabricante],
[modelo],
[acessorio],
[n_s],
[valor],
[status]
)
SELECT
[patrimonio],
[equipamento],
[fabricante],
[modelo],
[acessorio],
[n_s],
[valor],
[status]
FROM [dbo].aux_importacao;
SELECT * FROM CONTROL_EQUIPAMENTOS;
drop table aux_importacao
-- drop table CONTROL_EQUIPAMENTOS