SQL 2008 SSIS Lookup

O componente de transformação Lookup combina as linhas de uma origem (OLEDB SOURCE) com um DataSet que será informado diretamente nas configurações do próprio componente Lookup. Desta forma, o Lookup é tido como um componente que combina dois inputs. A combinação é feita via equi-joining, isto é, junção por igualdade, escolhendo-se as colunas ou coluna que serão usadas para fazer a igualdade, produzindo um output populado. Este componente de transformação se enquadra como multi-input ou multi-output transformation.

Na guia Columns do componente lookup nós configuramos as colunas que farão o relacionamento entre os inputs, através de mapeamento. É possível deixar as colunas do input DataSet como novas ou fazer replace sobre as colunas do input que se refere ao OLEDB SOURCE. O detalhe é que no OLEDB DESTINATION nós definimos quais colunas de qual input serão gravadas o resultado.

Exemplo: levantar quais empregados da tabela Empregado1 moram no mesmo estado que os empregados da tabela Empregado2. Neste simples cenário, nós desejamos gravar numa terceira tabela (empregado3) uma lista das tabelas empregado1 e empregado2 que moram no mesmo estado. Melhorando o exemplo podemos gravar numa quarta tabela (empregado4) a lista de empregados da tabela empregado1 que não residem em nenhum dos estados dos empregados da tabela empregado2.

Segue o passo a passo.

Inicialmente crie as tabelas e faça os inserts conforme script abaixo.

use master
go

if db_id(‘DBSSIS’) is not null
begin
    alter database dbssis set single_user with rollback immediate;
    drop database dbssis;
end;

create database DBSSIS

ALTER DATABASE DBSSIS SET RECOVERY SIMPLE;
GO

USE DBSSIS
GO

— as tabelas empregado 1 e 2 serão utilizadas para a package referente ao Lookup
CREATE TABLE dbo.Empregado1
(    IdEmpregado INT IDENTITY PRIMARY KEY,
    NmEmpregado VARCHAR(50) NOT NULL,
    DmUF CHAR(2) NOT NULL,
)
   
CREATE TABLE dbo.Empregado2
(    IdEmpregado INT IDENTITY PRIMARY KEY,
    NmEmpregado VARCHAR(50) NOT NULL,
    DmUF CHAR(2) NOT NULL,
)
GO

INSERT dbo.Empregado1 VALUES
(‘Ana Fernandes’, ‘RJ’),
(‘Mariana’, ‘ES’),
(‘FRANCISCANA’, ‘ES’)

INSERT dbo.Empregado2 VALUES
(‘FABRÍCIO’, ‘SP’),
(‘MARCOS’, ‘ES’),
(‘JORGE’, ‘MG’)
GO

— a tabela empregado 3 guardará a lista de empregados que moram no mesmo estado
— como resultado do etl
CREATE TABLE dbo.Empregado3
(    IdEmpregado1 INT,
    IdEmpregado2 INT,
    NmEmpregado1 VARCHAR(50) NOT NULL,
    NmEmpregado2 VARCHAR(50) NOT NULL,
    DmUF CHAR(2) NOT NULL,
)
GO

— a tabela empregado 4 guardará a lista de empregados que não moram no mesmo estado
— como resultado do etl
CREATE TABLE dbo.Empregado4
(    IdEmpregado INT,
    NmEmpregado VARCHAR(50) NOT NULL,
    DmUF CHAR(2) NOT NULL,
)
GO

 

Como segundo passo crie um novo projeto no ssis. Na package vazia crie uma conexão do OLE DB CONNECTION apontando para o banco DBSSIS. Insira uma Data Flow Task dentro do Control Flow, edite-a e insira um OLE DB SOURCE, um Lookup, e dois OLE DB DESTINATION.Configure o OLE DB SOURCE para usar empregado1, conforme figura abaixo:

image

 

Configure na guia Connection do componente Lookup, configure para usar a tabela empregado2:

image

 

Na guia  Columns faça o mapeamento do relacionamento usando as colunas UF de ambas as tabelas. Para tanto, arraste a coluna DmUF de uma tabela para outra ou clique com o botão direito do mouse, utilizando a opção Edit Mappings. Nas colunas Output Alias renomeie conforme figura abaixo:

image

 

Ligue uma seta verde do Lookup ao primeiro OLE DB DESTINATION, selecionando Lookup Match Output. Edite o OLE DB DESTINATION  e seleciona a empregado3. Edite a guia Mappings conforme abaixo:

image

 

Pronto. Finalmente ligue a segunda setinha verde do Lookup para o segundo OLE DB DESTINATION selecionando Lookup No Match Output. Edite a conexão deste OLE DB DESTINATION para usar a tabela empregado4.

Após esses passos, o seu Data Flow Task terá a seguinte aparência:

image

 

Execute e confira os resultados.