SSIS – Operadores Condicionais (IF-THEN-ELSE)

Um recurso muito importante para qualquer desenvolvimento que envolva lógica é a utilização dos condicionais (case, IF, else). Hoje iremos ver como aplicar este tipo de lógica através do integration services.

Primeiro iremos criar uma procedure, que irá retornar uma valor aleatório entre 1 e 4. O retorno desta proc será utilizado para uma tomada de decisão em nossa dtsx.

Crie uma procedure com o seguinte código:


CREATE PROCEDURE DBO.usp_numeroAleatorio(

@retorno tinyint output)

AS BEGIN

DECLARE @NUMERO AS TABLE (NUMERO TINYINT)

INSERT INTO @NUMERO

VALUES (1),(2),(3),(4)

set @retorno = (select  TOP 1 NUMERO FROM @NUMERO ORDER BY NEWID())

END --BEGIN

Agora abra seu Microsoft Visual Studio e crie um novo projeto de integration services em um diretório de sua preferência.

A primeira coisa será criar uma nova conexão com sua base de dados. Clique com o botão direito do mouse na área “Connection Manager” e vá em “New OLE DB Connection” e aponte para o banco de dados onde você criou nossa procedure.

1

Feito isso, vamos criar uma variável que irá armazenar o retorno da nossa procedure. Caso sua aba de variáveis não esteja visível você poderá ir até o menu SSIS > Variables e habilita-la.

Clique em “add new variable” e nomeie-a como “retornoProc” do tipo Int32.

2

Agora adicione um componente “Execute SQL Task” e dê dois cliques sobre ele.

3

Altere a propriedade connection para a conexão que criamos a pouco, a propriedade “resultset” para “sigle row” e o SQL Statement para “


DECLARE @RETORNO int

EXEC usp_numeroAleatorio @RETORNO = @RETORNO OUTPUT

select @retorno as retornoproc

vá até a opção “resultset” e adicione um novo resultSet e na propriedade ResultName coloque “retornoproc” (este nome foi atribuído no retorno da variável contida na SQL Task ).

Image

Vamos adicionar agora 5 componentes script task, todos eles deverão estar configurados da mesma forma:

Image

E com o seguinte código aplicado:

</pre>
public void Main()

{

try

{

MessageBox.Show(Dts.Variables["retornoProc"].Value.ToString());

Dts.TaskResult = (int)ScriptResults.Success;

}

catch (Exception)

{

Dts.TaskResult = (int)ScriptResults.Failure;

throw;

}

}
<pre> 

Obs: este código apenas serve para exibir o valor atual da nossa variável passada como parâmetro de entrada (ReadOnlyVariables)

Faça a ligação entre nosso SQL Task e cada um dos Scripts Task. Agora sim faremos a validação propriamente dita. Dê dois cliques na precedence constraint e altere a propriedade “Evaluation Operation” para “Expression” e na propriedade expression você deverá preencher com o valor adequado a cata possibilidade de retorno da proc.

Image

Em sua tela deverá havel algo parecido com isso agora:

Image

Vamos fazer um teste? Execute a DTS e veja o resultado:

Image

Mais uma vez:

Image

Espero que a dica tenha sido útil.

Abraços.

Dhiego Piroto

Anúncios

SSIS – Agrupando linhas importadas

Fala Galera,

A dica de hoje é bem simples mas muito útil.

Digamos que você precisa importar um arquivo de texto para seu banco de dados e deseja eliminar as linhas duplicadas, como fazer?

 

Primeiramente

 

</p><p>USE ImportaArquivos</p><p>GO</p><p>/*Tabela que irá armazenar todos os ceps contidos em um arquivo*/</p><p>CREATE TABLE listaCEPs(</p><p>      ID INT IDENTITY PRIMARY KEY,</p><p>      CEP VARCHAR(8),</p><p>      RUA varchar(100)</p><p>)</p><p>

 

Agora você irá criar um arquivo de texto, em um diretório de sua preferência, com o seguinte conteúdo:

 

CEP|Rua

03711110|Rua X

93711119|Rua D

03711110|Rua X

73711117|Rua W

03711110|Rua X

63711116|Rua Y

03711110|Rua X

63711116|Rua Y

 

 

Notem que temos:

       O CEP 03711110 aparecendo 4x.

       O CEP 93711119 aparecendo 1x.

       O CEP 73711117 aparecendo 1x.

       O CEP 63711116 aparecendo 2x.

 

Nós desejamos que não ajam linhas duplicadas, então em nossa tabela deverá existir apenas 4 registros.

 

Crie um novo projeto do integration services, adicione os seguintes componetnes:

  • Flat file source
  • Aggregate
  • OLE DB Destination

 

Mapeie arquivo de texto criado acima no componente flat file source. Ligue-o ao componente aggregate e de dois clique nele.

 

Selecione as colunas que você deseja que sejam importadas e na opção “operation” selecione o group by.

 

Image

 

Configure o OLE DB Destination para enviar os dados a nossas estrutura de tabelas criadas no passo 1.

Image

Clique em OK e execute a DTS.

Image

 

Faça um select na tabela dbo.ListaCeps para checarmos os resultados.

Image

Por hoje é isso pessoal.

 Abraços.

 Dhiego Piroto

SSIS – Utilizando o componente Derived Column

Imagine que temos que realizar a importação de um arquivo de texto com contenha informações como : Nome, Sobrenome e Idade. Porém, quando a idade da pessoa for inferior a 18 anos um campo boolean deverá ser preenchido como True.

Para fazer esse tipo de tarefa pelo SSIS utilizaremos o componente “Derived Column”.

Primeiro vamos criar uma estrutura tabular para armazenar os dados a serem inseridos

<br />use ImportaArquivos<br /><br />go<br /><br />CREATE TABLE tb_derivedColumn(<br /><br />id int identity(1,1) primary key,<br /><br />ch_nome varchar(100),<br /><br />ch_sobrenome varchar(100),<br /><br />bMenorde18 bit<br /><br />)<br /><br />

Agora iremos criar um arquivo de texto que contenha as seguintes informações.

Nome|Sobrenome|Idade

Dhiego|Piroto|23

Joana|D’arc|99

João|Paulo|17

Rodrigo|Dias|10

Salvaremos esse arquivo com o nome de “DerivedColumnImp.txt” em um diretório de sua preferencia.

Agora clique com o botão direito do mouse na área “Connection Managers”  e selecione a opção “new flat file connection…”. Após isso, faça uma referencia ao arquivo que criamos anteriormente, selecionando a primeira linha como cabeçalho.

Image

Clique em “OK” e depois adicione um componente “data flow task” ao projeto, de um duplo clique nele e adicione o componente  “Flat data source” e clique duas vezes nele.

Preencha listbox com a conexão que acabamos de criar (txtCnn), clique em columns e depois “OK”.

Agora adicionaremos o componente que irá atender a nossa regra, e validará a idade da pessoa, insira no projeto um componente “derived column” e faça a ligação entre o flat file e ele.; Após isso, clique 2x no novo componente.

Na aba esquerda, maximize o item “columns” e arraste o campo “idade” para a grid inferior. Após isso, preencha o campo expression com o seguinte código:

Idade > “18” ? 0:1 através esta expressão será validada a idade da pessoa e um valor booleano será retornado.

Image

Adicione um componente OLE DB Destination ao seu projeto, crie uma conexão com o DB onde criamos a tabela (passo 1) .

Image

Clique na aba “columns” e faça o apontamento das colunas e clique em OK.

Image

Execute a DTS.

Image

E confira o resultado no Management Studio.

Image

É isso galera!

Abraços

Dhiego PIroto

SSIS – Importando um arquivo via Script Task

Fala Galera,

Este será o primeiro artigo de uma série que irei fazer sobre dicas do SSIS.

Pretendo toda quarta feita disponibilizar um ou dois pequenos artigos.

Bem, hoje irei mostrar como importar um arquivo para uma tabela usando arquivos de configuração.

Primeiramente iremos criar a estrutura de tabelas que irá armazenar os dados do arquivo importado.


Create database ImportaArquivos

go

use ImportaArquivos

go

Create Table ImportaArquivoDinamico(

nm_id int identity(1,1) primary key,

ch_Nome varchar(100),

ch_sobreNome varchar(100),

dt_DataImportacao datetime default(getdate())

)

Abriremos o SSIS, iremos em New > NewProjetc > Integration Services Project  para criar um novo projeto:

1

Criaremos uma variável que irá contem o caminho do arquivo a ser importado:

2

Adicione uma Script task (aba control flow)

3

De um dois cliques na task e escolha como linguagem o C# 2008 e selecione a variável que criamos como no campo “readOnlyVariables”. Após isso de um clique em “Edit Script” para que possamos adicionar o código.

4

Iremos inserir o seguinte código (comentado)


using System;

using System.Data;

using Microsoft.SqlServer.Dts.Runtime;

using System.Windows.Forms;

&nbsp;

/*NameSpace que permite fazer a conex�o com a base SQL*/

using System.Data.SqlClient;

&nbsp;

/*NameSpace que permite fazer importações*/

using System.IO;

&nbsp;

namespace ST_65067a882bb04492b6e7ae064b642b3d.csproj

{

[System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]

public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

{

&nbsp;

#region VSTA generated code

enum ScriptResults

{

Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,

Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure

};

#endregion

&nbsp;

public void Main()

{

/*Armazena o caminho do arquivo a ser importado em uma vari�vel*/

String Arquivo = Dts.Variables["CaminhoArquivo"].Value.ToString();

&nbsp;

/*String de Conex�o ao DB*/

String SERVIDOR      = ".,1432";

String BANCO_INICIAL = "ImportaArquivos";

String USUARIO       = "usuario";

String SENHA         = "123";

&nbsp;

String connectionString = "Initial Catalog=" + BANCO_INICIAL + ";Data Source=" + SERVIDOR + ";Integrated Security=False;User ID=" + USUARIO + ";Password=" + SENHA + ";";

&nbsp;

try

{

/*Estabelece conexão com o servidor*/

SqlConnection cnn = new SqlConnection();

cnn.ConnectionString = connectionString;

cnn.Open();

/*Percorre cada linha do arquivo*/

foreach (String linha in File.ReadAllLines(Arquivo))

{

&nbsp;

/*Informa com que caracter é realizada a separação de colunas no arquivo*/

String[] inserir = linha.Split('|');

&nbsp;

/*Sobe o arquivo para memória antes de inserir*/

String comando = " insert into ImportaArquivoDinamico (ch_nome,ch_sobrenome) values ";

comando = comando + "('" + inserir[0].ToString() + "' , '" + inserir[1].ToString() +"')";

&nbsp;

/*Executa insert do comando*/

SqlCommand sqlCMD = new SqlCommand(comando, cnn);

sqlCMD.ExecuteNonQuery();

}

/*Fecha conexão*/

cnn.Close();

&nbsp;

/*Finaliza a DTS com sucesso.*/

Dts.TaskResult = (int)ScriptResults.Success;

}

catch(Exception e)

{

/*Finaliza a DTS com falha.*/

Dts.TaskResult = (int)ScriptResults.Failure;

}

}

}

}

&nbsp;

Muito bom! Agora já temos o código de importação pronto iremos configurar o SSIS para receber o nome do arquivo através de um txt.

Clique com o botão direto do mouse em qualquer área  do projeto e vá em propriedades.

Feito isso, localiza o menu abaixou e clique nas reticências.
5

Clique no check Box “Enable package configurations” e depois clique em ADD. Uma nova tela irá se abrir e você poderá escolher qual o tipo de arquivo de configuração você deseja, no nosso caso será um arquivo XML e depois explicite o diretório e nome do arquivo.

Clique em Next.

6

Depois disso uma nova tela irá se abrir e todas as variáveis serão exibidas. Você deverá selecionar a variável que criamos para o nome do arquivo e selecionar a opção “value” e depois clicar em “Finish” e no final “Close”.

7

Agora vá até o diretório em que você mapeou o arquivo de configuração e veja se ele já está na pasta. Se você fez tudo corretamente um arquivo similar a este deverá aparecer:
8

Agora para que possamos testar, você irá alterar a conteúdo da tag  <configuredValue> para um outro arquivo (que obedeça a mesma estrutura).

Após alterar o XML com o arquivo que você deseja, altere a propriedade “value” que está na variável no SSIS para 0 (zero) e execute o programa.

Por hoje é isso galera.

Abraços

Dhiego Piroto

Alex Souza

Banco de dados, Business Intelligence, Big Data, Governança de TI ... /* Um eterno aprendiz... */

Blog - Thiago Carlos de Alencar

Aprendendo SQL Server !

SQL Authority with Pinal Dave

SQL Server Performance Tuning Expert

Vitor Fava

SELECT (CrazyIdeas*2), (InsaneIdeas*100), MyExperience FROM MyBigHead WHERE InsaneLevel > 1000

Think Think SQL

DBCC DumpMemory 'TECH','ALL'

Gustavo Maia Aguiar

Artigos, dicas e algumas reflexões sobre o SQL Server

Kimberly L. Tripp

DBCC DumpMemory 'TECH','ALL'

Thiago Zavaschi R2

www.zavaschi.com

Blog do Luti

DBCC DumpMemory 'TECH','ALL'

Luan.Moreno a.k.a [SQL.Soul]

Lead Database Consultant at Pythian

Blog do Leka

let's make things better