top of page
  • Foto do escritorGabriel Quintella

SQL Server Integration Services, Trabalhando com componente File System Task

Fala coisa rica do meu coração, como que você está?


Fico muito feliz em poder encontrar com você novamente.


Nesse grande e maravilho post vou falar exclusivamente sobre o componente File System Task.


Um componente que utilizo bastante em meus fluxos pois manipulo muitos arquivos e sempre após os processamentos preciso "arquiva-los".


Me responde ai, você já precisou fazer isso? Já e não sabe como? Ah não...então não perde seu tempo, siga ai comigo...você vai gostar muito!


Antes de avançar para o código, vamos fazer uma breve introdução de como iremos trabalhar nesse post.


1 - Criação de um projeto SSIS - Sempre que trabalhamos com SSIS, existe a necessidade de realizar a criação de um projeto no Visual Studio, caso tenha criado nos posts anteriores, pode utilizar sem problemas, porém caso não tenha trate de criar pois é um item obrigatório! Dentro desse projeto vamos armazenar todos os pacotes de ETL;

2 - Criação de um pacote de ETL - Quando falamos em pacotes de ETL, estamos nos referindo ao conjunto de fluxos que será usado para trafegar com a nossa informação da sua origem até seu destino. Recomento que caso esteja acompanhando nossa série, crie um pacote para cada item, fica mais fácil o entendimento;

3 - Criando/Configurando as conexões - Vamos utilizar nesse nosso post duas conexões, uma do tipo Flat File Source pois vamos consumir um arquivo (Source) e uma do tipo OLE DB pois iremos consumir e gravar dados do Microsoft SQL Server (Destinantion)Esse é o passo onde definimos as conexão;

4 - Criando nosso Fluxo de Dados

4.1 - Componentes que serão usados - Nesse exemplo, vamos trabalhar de uma forma diferente do outros posts. Pois sempre apresentamos os componentes do Data Flow, nesse post a cereja do bolo está no Control Flow e diante disso vamos usar um componente de Execute SQL Task, que será usado para limpar a tabela, um componente de Data Flow que será responsável pelo fluxo de importação do arquivo até o destino e o componente File System Task, esse componente que será o responsável por realizar a cópia, eliminação, movimentação e renomear os arquivos importados;


Bora começar então!


1 - Criando um Projeto no SQL Server Integration Services


Vou considerar que você não tem nenhum projeto criado no Visual Studio do SQL Server Integration Service. Um ponto bem importante desse estudo é que não irei falar como que você realiza a configuração do seu ambiente, entenderei que você já tenha feito isso em outro momento.


Para criar um projeto é bem simples. Vamos abrir o Visual Studio e seguir os próximos passos.


(1) Selecionar File;

(2) New;

(3) Project;

(4) Caso tenha um projeto criado basta clicar em Open Project.



Após clicar em New Project, a tela abaixo será apresentada.


(1) Escolher Integration Services;

(2) Integration Services Project;

(3) Informar um nome para o Projeto;

(4) Definir o local (diretório) que o projeto será gerado;

(5) Informar uma nomenclatura para a sua solução;

(6) Caso queira que um diretório para o projeto seja criado basta marcar essa opção;

(7) Clicar em OK para realizar a criação;



2 - Criando nosso Pacote de ETL


Primeiro ação será a criação de um pacote do SSIS. Essa criação é bem simples, acompanha comigo.


(1) Clicar com o botão direito do mouse sobre SSIS Package;

(2) Clicar em New SSIS Package;


Além dessa possibilidade, outras ações podem ser realizadas.


  • Importar um Arquivo dtsx - basta clicar em Add Existng Package;

  • Realizar o Upgrade dos seus pacotes - basta clicar sobre Convert Deployment Model ou Upgrade All Package;

  • Realizar um Import and Export - basta clicar sobre SSIS Import and Export Wizard;

  • Ordenar seus pacotes - basta clicar em Sort by name.



Após a criação do nosso arquivo dtsx, vamos para o desenho do nosso fluxo.


(1) Nome do arquivo dtsx;


Para alterar basta clicar sobre ele e apertar o botão F4 e em file name informar o nome do seu pacote.



Ou clicar sobre o pacote e apertar F2



(2) Aba Control Flow;

(3) Inserir um componente de Data Flow Task;

(4) Realizar duplo clique ou clicar em Data Flow.



Ao clicar em Data Flow, vamos começar a brincadeira! Dessa vez vamos fazer iguais aos filmes de Hollywood começando do final. Apresento para você como que será o resultado final desse nosso trabalho (1).



Analisando como que fica o fluxo dentro do Data Flow.



Vamos trabalhar então para produzir mais esse conteúdo.


3 - Criando as Conexões


Primeiro passo será realizar a configuração das nossas conexões.


(1) Aba Connection Manage;

(2) Clicar com o botão direito do mouse e escolher New Flat File Connection;



Após selecionar esse tipo de conexão, vamos partir para configuração.


(1) Informar um nome para a conexão;

(2) Primeira configuração será na aba General;

(3) Selecionar o local onde está o nosso arquivo;

(4) Configurações referente ao nosso arquivo (Se ele é delimitado ou não, se possui um qualificador de texto, se a primeira linha do arquivo contém ou não o cabeçalho das colunas etc);

(4) Clicar em OK para confirmar.



Agora vamos para outra aba.


(1) O nome que você informou na tela anterior é carregado em todas as abas seguintes, não precisa informar;

(2) Vamos configurar a aba Columns;

(3) Selecionar o delimitador de linhas;

(4) Selecionar o delimitador de colunas;

(5) Uma prévia dos dados. Observe que o cabeçalho foi carregado pois na tela anterior informamos que a primeira linha do arquivo contém o cabeçalho;

(6) Caso nenhuma configuração a mais precise ser feita, podemos concluir a configuração clicando em OK.



(1) O nome que você informou na tela anterior é carregado em todas as abas seguintes, não precisa informar;

(2) Vamos configurar a aba Advanced;

(3) Nome da colunas;

(4) Nesse passo conseguimos visualizar informações referente ao nome da coluna, datatype, tamanho, tudo isso pode ser alterado;

(5) Nesse ponto é possível incluir ou eliminar uma coluna;

(6) Caso nenhuma configuração a mais precise ser feita, podemos concluir a configuração clicando em OK.



Agora vamos para o último ponto da configuração. Na aba Preview como o próprio nome diz, é uma prévia dos dados e além disso você pode também definir a quantidade de linhas que serão descartadas.


(1) O nome que você informou na tela anterior é carregado em todas as abas seguintes, não precisa informar;

(2) Vamos configurar a aba Advanced;

(3) Podemos definir a quantidade de linhas que serão descartadas;

(4) Prévia dos dados;

(5) Clicar em OK para finalizar a configuração.



Próximo passo é a configuração da conexão que será usada no Destination.


(1) Aba Connection Manage;

(2) Clicar com o botão direito do mouse e escolher New OLE DB Connection;



(1) Na aba Connection Manager, vamos clicar com o botão direito e selecionar OLE DB Connection Manager. Na tela que será apresentada, vamos clicar em New;

(2) Selecionar Native OLE DB\SQL Server Native Client 11.0;

(3) Informar o nome do servidor\instância;

(4) Selecionar o método de conexão;

(5) Selecionar o banco de dados. Clicando na setinha pra baixo é possível visualizar todos os bancos existentes em nosso servidor;

(6) Clicar em Test Connection para validar a conexão (Sempre comento que esse passo é desnecessário, pois ela já foi validada no passo anterior);

(7) Clicar em OK para finalizar.



4 - Criando o Fluxo de Dados


Na aba Control Flow, vamos selecionar seguir os seguintes passos.


(0) Podemos observar que a conexão criada está configurada e disponível;

(1) Em SSIS Toolbox o componente Data Flow Task;

(2) Sobre o componente Data Flow Task, vamos clicar com o botão direito;

(3) Clicar em Rename.


Na próxima tela conseguimos visualizar o esqueleto (1) do nosso motor.



4.1 - Configurando o Componente Source Assistant


Conforme imagem anterior, vamos fazer uso de 2 componentes! Um para a nossa origem de dados e uma para o destino dos dados.


(1) Em SSIS Toolbox, vamos selecionar o componente Source Assistant;

(2) Feito isso a tela ao centro será carregada;

(3) Como nossa origem será um arquivo, vamos selecionar Flat File;

(4) Selecionar a conexão que criamos;

(5) Observe que algumas informações referente a origem do arquivo é apresentada;

(6) Clicar em OK para confirmar.



4.2 - Configurando o Componente Destination Assistant


Agora vamos configurar o destino dos dados.


(1) Em SSIS Toolbox, vamos selecionar o componente Destination Assistant;

(2) Feito isso a tela ao centro será carregada;

(3) Como nosso destino será uma tabela do banco de dados, vamos selecionar SQL Server;

(4) Selecionar a conexão que criamos;

(5) Observe que algumas informações referente ao destino do arquivo é apresentada;

(6) Clicar em OK para confirmar.



Vamos selecionar de onde (tabela) os dados deverão ser carregados.


(1) Clicar duas vezes sobre o componente OLE DB Source;

(2) Na aba Connection Manager;

(3) Selecionar a conexão que criamos anteriormente;

(4) Nesse passo também é possível realizar a criação de uma nova conexão;

(5) Nesse ponto podemos selecionar se a nossa origem será uma tabela ou view, caso escolha, no passo seguinte você deverá selecionar em uma lista qual a origem e também pode ser selecionado um script, caso seja escolhida essa opção, no passo seguinte você deverá informar o script de consulta;

(6) Selecionar a origem, ou tabela ou script, depende do passo anterior;

(7) É possível visualizar uma prévia dos dados;

(8) E clicar em OK para finalizar.



4.3 - Configurando o Componente Execute SQL Task


Após configurar o Data Flow, vamos voltar para o Control Flow e realizar as configurações finais. Vamos destacar aqui que o componente de principal desse post está no Control Flow porém precisamos primeiro importar o arquivo para depois aplicar as configurações do componente.


Vamos adicionar nesse momento o componente Execute SQL Task que será responsável por realizar a limpeza na tabela antes de importar um arquivo.


Segue aqui comigo...


(1) Clicar na aba Control Flow, depois clicar em SSIS Toolbox e selecionar o componente Execute SQL Task;

(2) Nome do componente;

(3) Nesse passo vamos configurar apenas a aba General do componente Execute SQL Task;

(4) Informar o nome desse passo dentro do nosso fluxo;

(5) Selecionar a conexão, vamos usar a que criamos anteriormente;

(6) Incluir um script de TRUNCATE TABLE;

(7) Clicar em OK para finalizar.



4.4 - Configurando o Componente File System Task


Vamos falar um pouco sobre o nosso componente principal. O File System Task vai ser muito útil em seu desenvolvimento quando você precisar manusear arquivos, porém esse manuseio está relacionado não somente a leitura e carga.


Nesse momento estamos falando em copiar um arquivo de um ponto ao outro, renomear, excluir, ou seja, ele é muito útil.


No meu atual emprego faço bastante uso desse componente pois diariamente costumo trabalhar com quase 200 arquivos do tipo csv que são gerados pelo nosso ERP e importados pelo nosso processo de BI.


E após a sua importação, realizamos a movimentação deles com esse componente para um diretório que definimos como o nosso ficheiro de arquivos importados.


Vou demonstrar para você como que é fácil a sua utilização e configuração.


Segue aqui comigo...


Primeiro vamos ver como que criamos um processo com o componente File System Task usando a opção Move File


4.4.1 - Configurando o Componente File System Task - Move File


Vamos começar a configuração.


(1) Clicar na aba Control Flow, depois clicar em SSIS Toolbox e selecionar o componente File System Task;

(2) E o componente será carregado no nosso Control Flow, lembrando que ele é um componente de Control Flow, não de Data Flow, então fique esperto pois caso esteja na aba Data Flow não irá encontra-lo!



Após inclui-lo em nosso fluxo, vamos iniciar a sua configuração!


(1) Duplo clique no componente e vamos concentrar nosso esforço na aba General;


Esse nosso componente na sua área de configuração quando selecionada a Operação (Operation) Move File, Copy File ou Rename File possui sua configuração dividida em 4 níveis: Destination Connection, General, Operation e Source Connection. Vamos explorar cada uma delas:


Destination Connection - Local onde parametrizamos informações sobre o nosso destino, ou seja, o que faremos com ele depois de consumir!


(2) IsDestinatioPathVariabel - Definimos se iremos trabalhar ou não com uma variável. True para usar e False para não usar;

(3) DestinationConnection - Local onde definimos o destino do arquivo. Caso no passo anterior você definiu que não irá uma variável (False), deverá nesse local informar o destino do arquivo porém caso tenha definido que estará usando uma variável (True), deverá selecionar em uma lista qual é a variável;

(4) OverwriteDestination - Local onde definimos se o arquivo será sobrescrito no destino ou não. True para sobrepor e False para não sobrepor. Esse ponto requer uma atenção especial, pois caso não seja definido com clareza, seu processo de carga pode quebrar durante a execução e você como desenvolver dever prever tudo, mesmo não sendo a Mãe Diná. Não esqueça disso!;


General - Local onde realizamos apenas a definição de um nome para o nosso componente!


(5) Local onde definimos um nome (Name) e até mesmo uma breve descrição para o componente (Description);


Operation - Local onde definimos o que faremos com o arquivo após a conclusão do processo. Podemos mover, renomear, copiar, excluir e podemos aplicar também ações sobre o diretório.


(6) Operation - Local que definimos qual a ação será aplicada sobre o arquivo. Como falamos acima, existem várias possibilidades.


E Source Connection - Local onde definimos a conexão com o nossa nossa origem.


(7) IsDourcePathVariable - Conforme realizamos com o Destination, no Source também podemos definir se ele será configurado usando uma variável ou não;

(8) SourceConnection - Local onde definimos a conexão com o Source. Caso no item (7) tivéssemos escolhido uma variável, nesse momento estaríamos escolhendo a variável e caso contrário escolheríamos o caminho;


Supondo que você tenha escolhido a parametrização do destino através de uma variável, observe como que realizamos a sua configuração.


(1) Na aba General;

(2) Em IsDestinationPathVariable definimos True;

(3) Em DestinationValiable vamos criar a nossa variável. Basta clicar na setinha do canto direito para baixo e clicar em <New variable>.



Feito isso a tela abaixo será apresentada.


(1) Tela de configuração da Variável. Na verdade com isso vamos adicionar uma variável que pode ser a nível de projeto ou apenas desse componente;

(2) Em Container, vamos selecionar Package1, caso você tenha nomeado o seu projeto, o nome dado será apresentado nesse local;

(3) Em Name vamos informar um nome para nossa variável. Muito importando você colocar um nome bem claro, que deixe claro para que serve;

(4) Em Value Type, vamos definir o datatype dessa variável;

(5) Em Value, definimos um valor para a variável

(6) Clicar em OK para finalizar.



Após configurar a variável para o destino, vamos configurar a conexão com a nossa origem.


(1) Em IsSourcePathVariable vamos definir False e em SourceConnection definir a conexão que criamos;

(2) Clicar em OK para finalizar.



Após definir a origem e o destino e qual ação será aplicada, vamos analisar nosso fluxo em execução.


(1) Fluxo executado com sucesso;

(2) Conforme definimos na aba General item (6), o arquivo após o processamento deveria ser copiado para o diretório C:\tmp\Importado.



Agora vamos dar uma atenção a um ponto que destaquei acima.


Vocês estão lembrados que mencionei que é papel do desenvolver prever tudo que pode ocorrer em seu fluxo?


Pois bem imagine que surgiu a necessidade de importar um outro arquivo e por sinal ele possui o mesmo nome. O que você acha que vai acontecer?


Quem falou que vai processar com sucesso, ERROU!!! Quando realizamos a configuração do componente e em OverwriteDestination definimos o valor False, ou seja, se um arquivo for processo com o mesmo nome esse fluxo vai falhar.


Observe abaixo o que estou falando!


(1) Fluxo executado;

(2) Componente finalizado com erro;

(3) Mensagem de erro. Observe o que está escrito. Cannot create a file when that file already exists, ou seja, ele não pode criar algo que já existe.


Como resolver isso? Será que é fácil? Difícil?


Vamos ver....



Vamos parar a execução, dar um duplo clique no componente e resolver o problema.


(1) Após duplo clique no componente;

(2) Na aba General;

(3) Em OverwriteDestination, vamos alterar de False para True e clicar em OK para finalizar.


Com isso permitimos que caso exista no destino o arquivo que estamos movendo, ele será sobrescrito, nunca mais ocorrendo esse erro!



Muito bem, o que achou? Fácil? Difícil? Confesso para você que acho um pouco difícil sim, esse componente na minha classificação estão no nível intermediário.


Agora vou apresentar para você como que podemos fazer isso com o Source parametrizado.


Peço que você preste um pouco de atenção, pois o nível de dificuldade irá aumentar um pouco. Vamos lá, antes de iniciar vou detalhar o que vamos fazer. Bora lá!


1 - Criar uma variável para receber informações da origem do arquivo, diretório + nome do arquivo;

2 - Vamos voltar na configuração do arquivo e parametrizar ela para que possa agora usar uma informação que estará vindo de uma variável, ou seja, não será mais um valor fixo;

3 - Voltar no componente File System Task e trocar a configuração para usar agora a variável.


Agora vamos aplicar essas alterações!


No exemplo anterior usei a opção Move File, agora vou apresentar para você o mesmo componente porem dessa vez usando a opção Copy File.


4.4.2 - Configurando o Componente File System Task - Copy File


Observem que a configuração do componente usando Move File ou Copy File é a mesma, a grande diferença está exatamente no comportamento do componente e a opção selecionada.


  • Quando selecionamos a opção Move File ele funciona como se você tivesse usado a em seu computador a opção de recordar um arquivo ou o famoso Ctrl+X e Ctrl+V, que ao ser executado o arquivo é retirado de um diretório e colocado em outro;

  • E quando selecionamos a opção Copy File, o comportamento é idêntico ao Ctrl+C e Ctrl+V, ou seja, é realizada uma cópia do arquivo sem que ele seja movido da origem;


Acompanha nas próximas telas...


(1) Nosso fluxo;

(2) Em Variables vou criar uma variável que irá receber o caminho e nome do arquivo.



Agora vamos parametrizar a conexão.


(1) Clicar sobre a conexão e apertar o botão F4;

(2) Em Properties vamos buscar Expressions e clicar no quadrinho que existe;

(3) Ao clicar no quadradinho, na tela Property Expressions vamos selecionar em Property ConnectionString;

(4) Expression vamos clicar no quadradinho do canto;

(5) Feito isso, a tela Expression Builder será carregada. Em Variables and Parameters vamos selecionar a variável que criamos e arrastar para a área Expression;

(6) A variável será apresentada;

(7) Podemos clicar em Evaluete Expression para visualizar o valor que informamos para ela;

(8) Após clicar o valor é apresentado em Evalueted value;

(9) Clicar em OK para finalizar a tela Expression Builder;

(7) Clicar em OK para finalizar a configuração da parametrização.



E para fechar, vamos voltar no componente e alterar para fazer uso de variável.


(1) Duplo clique no componente File System Task;

(2) Em IsSourcePathVariable alterar de False para True e em SourceVariable selecionar a variável que criamos;

(3) Clicar em OK para finalizar.



Vamos agora testar! Será que essa joça funciona?


(1) Fluxo executado;

(2) Arquivo parametrizado carregado.



E ai o que achou? Consegui deixar claro para você como que podemos importar um arquivo e ao término move-lo ou copia-lo para um outro diretório?


Pois bem cara-pálida, agora vamos ver como podemos apagar um arquivo! É bem simples também! Olha ai...


Vamos usar o mesmo fluxo porém ao invés do mover o arquivo para um diretório qualquer, vamos apaga-lo!


4.4.3 - Configurando o Componente File System Task - Delete File


(1) Voltando no nosso fluxo, vamos realizar um duplo clique sobre o nosso componente;

(2) Em Operation, vamos selecionar a opção de Delete File;

(3) Clicar em OK para finalizar.



Analise na tela abaixo o fluxo do componente!



Ué, só isso? Sim!


Me diz ai o que você viu de diferente nesse processo comparando como anterior?


Isso mesmo, no outro configuramos origem e destino e nesse configuramos apenas a origem. Agora vou fazer outra pergunta, por que nós não realizamos a configuração do destino?


Não acredito que não sabe!


Meu jovem, tudo isso está relacionado com a operação que você definiu.


No primeiro fluxo, definimos que o nosso arquivo após ser importado deveria ser movido para um outro local, ou seja, precisamos ter uma origem e um destino enquanto nesse último caso definimos que o arquivo após ser processado deveria ser excluído, por isso possuímos apenas a configuração de source.


Vamos analisar agora como que seria o nosso fluxo para renomear um arquivo? Are you ready? Let´s go!


4.4.4 - Configurando o Componente File System Task - Rename File


Ao analisar a tela abaixo usando a opção Rename File, acredito que na sua cabeça está vindo a seguinte afirmação, a sua configuração é exatamente identifica ao do Copy File e Move File (já comentei isso no inicio do post), porém aposto que também tem o seguinte questionamento, por que que ao definir a variável diretorioImportacaoArquivo foi informado no campo Value além do diretório um nome para o arquivo?



Muito bem coisa rica, está prestando bastante atenção mesmo!!!!


Vamos lá então esclarecer esse questionamento.


Quando usamos a opção rename, devemos estar informando um nome nome para esse arquivo assumir após a importação, correto?


Porém volta na tela anterior, analisa e me responda, onde você acha que informamos isso?


Muito bemmmmmmmmmmmmmmmmmmm!!! Na opção DestinationVariable. Por esse motivo que informei além do diretório o novo nome do arquivo.


Então meu amigo por hoje é só!! O que achou? Espero que tenha gostado!


Os arquivos usados até aqui estão disponíveis em:



Pacote SSIS - File System Task


14_Importa_Cargos_File_System_Task_Copy_File.dtsx

14_Importa_Cargos_File_System_Task_Delete_File.dtsx

14_Importa_Cargos_File_System_Task_Move_File.dtsx

14_Importa_Cargos_File_System_Task_Rename_File.dtsx


5 - Conclusão


Cara, que massa que foi esse post hein! Curtiu? Eu curti bastante, vários likes para ele!


Olhando assim esse componente parece ser bem simples, e com pouco utilidade.


Mais está completamente errado, ou melhor, 50% errado, acertou apenas a parte de que afirmou que ele parece ser simples, mais errou ao afirmar que possuiu pouca utilidade.


Conforme mencionei no post, na empresa em que atuo como Engenheiro de Dados, esse é um dos principais componente utilizados tanto no SSIS quanto no Data Factory. No Data Factory ele assume outro nome, mais o comportamento é o mesmo.


Gosto muito de combinar ele com o próximo componente que irei falar no post seguinte, se eu fosse você não perdia por nada, pois nesse post vamos aprender como listar os arquivos de um diretório e importa-los todos um de cada vez!


Vai perder? Duvido!!!!


Muito obrigado e nos encontramos em breve! Grande abraço e fique com Deus!


12 visualizações0 comentário

Posts recentes

Ver tudo
bottom of page