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