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 OFFgoCREATE PROCEDURE SP_ImportaTxt @PathFicheiro varchar(100),@Valor integer, @TipoFicheiro tinyint --Step 1: BULK INSERT StatementDECLARE @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