Wednesday, October 26, 2011

Bem, é provável que já tenham precisado de importar dados de um ficherito de texto para uma tabela do sql server, se não precisou quando precisar já sabe quando acabar de ler este post :)

Tendo em conta que podem existir basicamente dois tipo de ficheiro txt ou csv vamos tentar criar uma solução que consiga lidar com essa situação.

BULK INSERT foi introduzido no SQL Server 7 e permite a interação com o bcp ( bulk copy program). Nas versões anteriores do SQL Server só era possível aceder ao bcp pela prompt.

Agora temos dois tipos de ficheiros:

TipoFicheiro=1(txtFile1.txt)

"Jose";"Fernandes";"20"
"Maria";Isabel";"21"
"Rui";"Costa";"10"

TipoFicheiro=2(txtFile2.txt)

Jose;Fernandes;20
Maria;Isabel;21
Rui;Costa;10


Tendo já os nossos ficheiro vou mostrar a syntax:
BULK INSERT tabelaTemp FROM 'c:txtFile1.txt' WITH(FIELDTERMINATOR= ' ";" ')
tabelaTemp -> table temporária de destino dos dados
FIELDTERMINATOR -> argumento que permite especificar qual o delimitador das colunas
BULK INSERT tabelaTemp FROM 'c:txtFile2.txt' WITH(FIELDTERMINATOR= ';')
Aqui a única diferença é o valor do argumento FIELDTERMINATOR

Para facilitar a reutilização vamos criar uma stored procedure, mas antes vou criar a tabela que vai receber os dados.
A tabela final e temporária:

CREATE TABLE TDados
(
ID int IDENTITY NOT NULL,
Nome varchar(50) NOT NULL,
SobreNome varchar(50) NOT NULL,
Idade int NOT NULL,
Valor int NOT NULL
)
go
CREATE TABLE TDados_TEMP
(
Nome varchar(50) NOT NULL,
SobreNome varchar(50) NOT NULL,
Idade int NOT NULL
)
go
e agora a nossa stored:



SET QUOTED_IDENTIFIER OFF
go
CREATE PROCEDURE SP_ImportaTxt 
@PathFicheiro varchar(100),
@Valor integer, 
@TipoFicheiro tinyint 
--Step 1:  BULK INSERT Statement
DECLARE @SQL varchar(2000) 
IF @TipoFicheiro = 1  
BEGIN   
-- formato válido: "M";"A";"10"   
SET @SQL = "BULK INSERT TDados_TEMP FROM '"+@PathFicheiro +"' WITH (FIELDTERMINATOR = '"";""') "
  END ELSE  BEGIN   -- formato válido: M;A;10   SET @SQL = "BULK INSERT TDados_TEMP FROM '"+@PathFicheiro +"' WITH (FIELDTERMINATOR = ';') "  END  --Step 2: Executar BULK INSERT statement EXEC (@SQL)  --Step 3: Inserir os dados na tabela finalINSERT TDados(Nome,SobreNome,Idade,Valor) SELECT  CASE WHEN @TipoFicheiro = 1 THEN SUBSTRING(Nome,2,DATALENGTH(Nome)-1)              ELSE Nome         END,         CASE WHEN @TipoFicheiro= 1 THEN SUBSTRING(SobreNome,1,DATALENGTH(SobreNome)-1)              ELSE SobreNome         END,         @Valor FROM TDados_TEMP  --Step 4: Empty temporary table TRUNCATE TABLE TDados_TEMP go

Tenha em atenção que devera verificar se SET QUOTED_IDENTIFIER é OFF, por causa das aspas....
Depois eh só chamar a stored:
EXEC SP_ImportaTxt 'c:txtFile1.txt',1,2
EXEC SP_ImportaTxt 'c:txtFile2.txt',2,15
E pronto és isto:D espero não ter nenhum BUG :)
Se quiseres saber mais sobre a sintaxe do BULK INSERT é só ir aqui.
Cumprimentos

No comments:

Post a Comment