Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SSIS - Utilisation d'un conteneur de boucle foreach pour mettre à jour les enregistrements après le transfert

Vous avez probablement déjà trouvé une réponse à votre question. Cette réponse est d'aider les autres qui pourraient tomber sur cette question. Voici une option possible qui peut être utilisée pour résoudre le transfert de données à l'aide de SSIS. J'ai supposé que vous pouviez toujours créer des chaînes de connexion pointant vers vos serveurs A et B à partir du package SSIS. Si cette hypothèse est fausse, veuillez me le faire savoir afin que je puisse supprimer cette réponse. Dans cet exemple, j'utilise SQL Server 2008 R2 comme arrière-plan. Comme je n'ai pas deux serveurs, j'ai créé deux tables identiques dans des Schemas différents ServeurA et ServeurB .

Processus étape par étape :

  1. Dans le Connection manager section du SSIS, créez deux connexions OLE DB à savoir ServerA et ServeurB . Cet exemple pointe vers le même serveur mais dans votre scénario, les connexions devront pointer vers vos deux serveurs différents. Reportez-vous à la capture d'écran #1 .

  2. Créer deux schémas ServerA et ServerB . Créez la table dbo.ItemInfo dans les deux schémas. Les scripts de création pour ces tables sont indiqués sous Scripts section. Encore une fois, ces objets sont pour cet exemple uniquement.

  3. J'ai rempli les deux tables avec des exemples de données. Tableau ServerA.ItemInfo contient 2,222 rows et la table ServerB.ItemInfo contient 10,000 rows . Selon la question, les 7 778 manquants les lignes doivent être transférées depuis ServerB vers ServerA . Reportez-vous à la capture d'écran #2 .

  4. Dans l'onglet de flux de contrôle du package SSIS, placez une tâche de flux de données comme indiqué dans la capture d'écran #3 .

  5. Double-cliquez sur la tâche de flux de données pour accéder à l'onglet de flux de données et configurez la tâche de flux de données comme décrit ci-dessous. Serveur B est une OLE DB Source; Rechercher un enregistrement sur le serveur A est une Lookup transformation task et Serveur A est une OLE DB Destination .

  6. Configurer OLE DB Source Serveur B comme le montrent les captures d'écran #4 et #5 .

  7. Configurer la Lookup transformation task Rechercher un enregistrement sur le serveur A comme le montrent les captures d'écran #6 - #8 . Dans cet exemple, ItemId est la clé unique. Il s'agit donc de la colonne utilisée pour rechercher les enregistrements manquants entre les deux tables. Puisque nous n'avons besoin que des lignes qui n'existent pas dans le serveur A , nous devons sélectionner l'option Redirect rows to no match output .

  8. Placer une OLE DB Destination sur la tâche de flux de données. Lorsque vous connectez la tâche de transformation de recherche avec la destination OLE DB, vous serez invité avec Input Output Selection dialogue. Sélectionnez Lookup No Match Output à partir de la boîte de dialogue comme indiqué dans la capture d'écran #9 . Configurer la OLE DB Destination Serveur A comme le montrent les captures d'écran #10 et #11 .

  9. Une fois la tâche de flux de données configurée, elle devrait ressembler à celle illustrée dans la capture d'écran #12 .

  10. Un exemple d'exécution du package est illustré dans la capture d'écran #13 . Comme vous pouvez le constater, les 7,778 rows manquantes ont été transférés depuis le Server B vers Server A . Reportez-vous à la capture d'écran #14 pour afficher le nombre d'enregistrements de table après l'exécution du package.

  11. Étant donné que l'exigence était d'insérer uniquement les enregistrements manquants, cette approche a été utilisée. Si vous souhaitez mettre à jour des enregistrements existants et supprimer des enregistrements qui ne sont plus valides, veuillez vous référer à l'exemple que j'ai fourni dans ce lien. SQL Integration Services pour charger le fichier délimité par des tabulations ? L'exemple du lien montre comment transférer un fichier plat vers SQL, mais il met à jour les enregistrements existants et supprime les enregistrements non valides. De plus, l'exemple est affiné pour gérer un grand nombre de lignes.

J'espère que ça aide.

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

Capture d'écran 1 :

Capture d'écran 2 :

Capture d'écran 3 :

Capture d'écran 4 :

Capture d'écran #5 :

Capture d'écran 6 :

Capture d'écran n° 7 :

Capture d'écran 8 :

Capture d'écran #9 :

Capture d'écran 10 :

Capture d'écran 11 :

Capture d'écran 12 :

Capture d'écran 13 :

Capture d'écran 14 :