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