Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SSIS - Usando um contêiner de loop foreach para atualizar registros após a transferência


Provavelmente, você já encontrou uma resposta para sua pergunta. Esta resposta é para ajudar outras pessoas que possam se deparar com essa pergunta. Aqui está uma opção possível que pode ser usada para resolver a transferência de dados usando o SSIS. Eu assumi que você ainda pode criar cadeias de conexão apontando para os servidores A e B do pacote SSIS. Se essa suposição estiver errada, por favor me avise para que eu possa excluir esta resposta. Neste exemplo, estou usando o SQL Server 2008 R2 como back-end. Como não tenho dois servidores, criei duas tabelas idênticas em diferentes Schemas Servidor A e Servidor B .

Processo passo a passo:

  1. No Connection manager seção do SSIS, crie duas conexões OLE DB, a saber, ServerA e Servidor B . Este exemplo está apontando para o mesmo servidor, mas no seu cenário, as conexões precisarão apontar para seus dois servidores diferentes. Consulte a captura de tela nº1 .

  2. Crie dois esquemas ServerA e ServerB . Crie a tabela dbo.ItemInfo em ambos os esquemas. A criação de scripts para essas tabelas é fornecida em Scripts seção. Novamente, esses objetos são apenas para este exemplo.

  3. Eu preenchi ambas as tabelas com alguns dados de exemplo. Tabela ServerA.ItemInfo contém 2,222 rows e tabela ServerB.ItemInfo contém 10,000 rows . De acordo com a pergunta, os 7.778 desaparecidos as linhas devem ser transferidas de ServerB para ServerA . Consulte a captura de tela nº2 .

  4. Na guia de fluxo de controle do pacote SSIS, coloque uma tarefa de fluxo de dados conforme mostrado na captura de tela #3 .

  5. Clique duas vezes na tarefa de fluxo de dados para navegar até a guia de fluxo de dados e configure a tarefa de fluxo de dados conforme descrito abaixo. Servidor B é uma OLE DB Source; Encontrar registro no Servidor A é uma Lookup transformation task e Servidor A é um OLE DB Destination .

  6. Configurar OLE DB Source Servidor B conforme mostrado nas capturas de tela #4 e #5 .

  7. Configurar Lookup transformation task Encontrar registro no Servidor A conforme mostrado nas capturas de tela #6 - #8 . Neste exemplo, ItemId é a chave exclusiva. Portanto, essa é a coluna usada para procurar registros ausentes entre as duas tabelas. Como precisamos apenas das linhas que não existem no Servidor A , precisamos selecionar a opção Redirect rows to no match output .

  8. Coloque um OLE DB Destination na tarefa de fluxo de dados. Ao conectar a tarefa de transformação Lookup com OLE DB Destination, você será solicitado com Input Output Selection diálogo. Selecione Lookup No Match Output na caixa de diálogo, conforme mostrado na captura de tela #9 . Configure o OLE DB Destination Servidor A conforme mostrado nas capturas de tela #10 e #11 .

  9. Depois que a tarefa de fluxo de dados estiver configurada, ela deverá ter a aparência mostrada na captura de tela #12 .

  10. A execução de amostra do pacote é mostrada na captura de tela #13 . Como você pode notar, as 7,778 rows ausentes foram transferidos do Server B para Server A . Consulte a captura de tela nº14 para visualizar a contagem de registros da tabela após a execução do pacote.

  11. Como o requisito era apenas inserir os registros ausentes, essa abordagem foi usada. Se você deseja atualizar os registros existentes e excluir registros que não são mais válidos, consulte o exemplo que forneci neste link. SQL Integration Services para carregar arquivo delimitado por tabulação? O exemplo no link mostra como transferir um arquivo simples para SQL, mas atualiza os registros existentes e exclui registros inválidos. Além disso, o exemplo é ajustado para lidar com um grande número de linhas.

Espero que ajude.

Scripts

.
CREATE SCHEMA [ServerA] AUTHORIZATION [dbo]
GO

CREATE SCHEMA [ServerB] AUTHORIZATION [dbo]
GO

CREATE TABLE [ServerA].[ItemInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemId] [varchar](255) NOT NULL,
    [ItemName] [varchar](255) NOT NULL,
    [ItemType] [varchar](255) NOT NULL,
    CONSTRAINT [PK_ItemInfo] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [UK_ItemInfo_ItemId] UNIQUE NONCLUSTERED ([ItemId] ASC)
) ON [PRIMARY]
GO

CREATE TABLE [ServerB].[ItemInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemId] [varchar](255) NOT NULL,
    [ItemName] [varchar](255) NOT NULL,
    [ItemType] [varchar](255) NOT NULL,
    CONSTRAINT [PK_ItemInfo] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [UK_ItemInfo_ItemId] UNIQUE NONCLUSTERED ([ItemId] ASC)
) ON [PRIMARY]
GO

Captura de tela nº 1:



Captura de tela nº 2:



Captura de tela nº 3:



Captura de tela nº 4:



Captura de tela nº 5:



Captura de tela nº 6:



Captura de tela nº 7:



Captura de tela nº 8:



Captura de tela nº 9:



Captura de tela nº 10:



Captura de tela nº 11:



Captura de tela nº 12:



Captura de tela nº 13:



Captura de tela nº 14: