none
Inserir dados em colunas específicas de uma tabela a partir de um arquivo CSV RRS feed

  • Pergunta

  • Boa noite,

    É possível inserir dados em colunas específicas de uma determinada tabela no SQL Server 2012 a partir de um arquivo CSV.

    Sei que a sintaxe abaixo funciona

    truncate table dbo.CONTATOS1
    GO

    BULK INSERT
    dbo.CONTATOS1
    FROM 'C:\Users\Jonas\Downloads\arquivo.csv'
    WITH
    (
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '\n'
    )
    GO

    No entanto, a minha tabela possui a primeira coluna auto increment e a segunda coluna não é para os dados contidos no meu arquivo CSV.

    Portanto preciso especificar a ordem das colunas onde os dados serão inseridos.

    Obrigado desde já.

    quarta-feira, 5 de novembro de 2014 03:44

Respostas

  • Deleted
    quarta-feira, 5 de novembro de 2014 09:55
  • Jonas,

    É possível sim, será necessário criar um arquivo FMT com a definição das colunas, especificando o separador (ou pode ser também tabulado) e a versão do SQL que você vai manipular os dados.

    Você pode definir a estrutura do arquivo FMT como XML ou Texto estruturado (particularmente eu sempre utilizei a segunda opção).

    Os acessos para o usuário do serviço SQL ao arquivo FMT são idênticos aos demais arquivos, mas preferencialmente armazene este arquivo em um diretório diferente dos arquivos de carga para evitar erro na manipulação dos arquivos (movendo ou apagando o que não se deve).

    Para maiores informações veja:

    http://msdn.microsoft.com/pt-br/library/ms178129.aspx

    http://msdn.microsoft.com/pt-br/library/ms191516.aspx

    http://msdn.microsoft.com/pt-br/library/ms191175.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 5 de novembro de 2014 10:08
    Moderador
  • Bom dia,

    No seu caso eu faria o uso do BULK Insert que é muito rápido, porém, criaria uma tabela #TEMP e o BULK insert seria na tabela #TEMP, feito isso, faz o insert com select para sua tabela.

    CREATE PROCEDURE P_IMPORTATXT(@TABELA VARCHAR(50), @DIR VARCHAR(100), @ARQUIVO VARCHAR(500), @SEPARADOR VARCHAR(1))
    AS
    DECLARE @EXECSTR NVARCHAR(MAX);
    DECLARE @CMD VARCHAR(1000);
    BEGIN
    
    -- aqui voce faz seu create table #temp
    
        SET  @EXECSTR = 'BULK INSERT ' +  @TABELA + ' FROM  ' + '''' + @DIR + @ARQUIVO + '''' +
    	' WITH
    	(
    		FIELDTERMINATOR = ' + '''' + @SEPARADOR + '''' + ',  
    		ROWTERMINATOR = ''\n'' 
    	) '
    	
    	--PRINT @EXECSTR;
    	EXEC SP_EXECUTESQL @EXECSTR;
    
    -- aqui você faz seu insert com select na sua #temp
    	
    	SELECT @CMD = 'DEL ' + @DIR + @ARQUIVO + ' /Q';
    	
    	PRINT @CMD;
    	
    	EXEC xp_cmdshell @CMD;
    
    END



    Atenciosamente, Ruberlei. www.t-sql.com.br

    • Sugerido como Resposta Ruberlei quarta-feira, 5 de novembro de 2014 14:52
    • Não Sugerido como Resposta Ruberlei quarta-feira, 5 de novembro de 2014 14:53
    • Sugerido como Resposta Ruberlei quarta-feira, 5 de novembro de 2014 14:53
    • Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 5 de novembro de 2014 18:03
    quarta-feira, 5 de novembro de 2014 11:28

Todas as Respostas

  • Deleted
    quarta-feira, 5 de novembro de 2014 09:55
  • Jonas,

    É possível sim, será necessário criar um arquivo FMT com a definição das colunas, especificando o separador (ou pode ser também tabulado) e a versão do SQL que você vai manipular os dados.

    Você pode definir a estrutura do arquivo FMT como XML ou Texto estruturado (particularmente eu sempre utilizei a segunda opção).

    Os acessos para o usuário do serviço SQL ao arquivo FMT são idênticos aos demais arquivos, mas preferencialmente armazene este arquivo em um diretório diferente dos arquivos de carga para evitar erro na manipulação dos arquivos (movendo ou apagando o que não se deve).

    Para maiores informações veja:

    http://msdn.microsoft.com/pt-br/library/ms178129.aspx

    http://msdn.microsoft.com/pt-br/library/ms191516.aspx

    http://msdn.microsoft.com/pt-br/library/ms191175.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quarta-feira, 5 de novembro de 2014 10:08
    Moderador
  • Bom dia,

    No seu caso eu faria o uso do BULK Insert que é muito rápido, porém, criaria uma tabela #TEMP e o BULK insert seria na tabela #TEMP, feito isso, faz o insert com select para sua tabela.

    CREATE PROCEDURE P_IMPORTATXT(@TABELA VARCHAR(50), @DIR VARCHAR(100), @ARQUIVO VARCHAR(500), @SEPARADOR VARCHAR(1))
    AS
    DECLARE @EXECSTR NVARCHAR(MAX);
    DECLARE @CMD VARCHAR(1000);
    BEGIN
    
    -- aqui voce faz seu create table #temp
    
        SET  @EXECSTR = 'BULK INSERT ' +  @TABELA + ' FROM  ' + '''' + @DIR + @ARQUIVO + '''' +
    	' WITH
    	(
    		FIELDTERMINATOR = ' + '''' + @SEPARADOR + '''' + ',  
    		ROWTERMINATOR = ''\n'' 
    	) '
    	
    	--PRINT @EXECSTR;
    	EXEC SP_EXECUTESQL @EXECSTR;
    
    -- aqui você faz seu insert com select na sua #temp
    	
    	SELECT @CMD = 'DEL ' + @DIR + @ARQUIVO + ' /Q';
    	
    	PRINT @CMD;
    	
    	EXEC xp_cmdshell @CMD;
    
    END



    Atenciosamente, Ruberlei. www.t-sql.com.br

    • Sugerido como Resposta Ruberlei quarta-feira, 5 de novembro de 2014 14:52
    • Não Sugerido como Resposta Ruberlei quarta-feira, 5 de novembro de 2014 14:53
    • Sugerido como Resposta Ruberlei quarta-feira, 5 de novembro de 2014 14:53
    • Marcado como Resposta Ricardo Barbosa Cortes quarta-feira, 5 de novembro de 2014 18:03
    quarta-feira, 5 de novembro de 2014 11:28