sql >> Database >  >> RDS >> Sqlserver

SSIS - Een foreach-luscontainer gebruiken om records bij te werken na overdracht

Waarschijnlijk heb je inmiddels een antwoord op je vraag gevonden. Dit antwoord is bedoeld om anderen te helpen die op deze vraag zouden kunnen stuiten. Hier is een mogelijke optie die kan worden gebruikt om de gegevensoverdracht op te lossen met behulp van SSIS. Ik ging ervan uit dat je vanuit het SSIS-pakket nog steeds verbindingsreeksen kunt maken die naar zowel je servers A als B verwijzen. Als die veronderstelling onjuist is, laat het me dan weten, zodat ik dit antwoord kan verwijderen. In dit voorbeeld gebruik ik SQL Server 2008 R2 als backend. Aangezien ik geen twee servers heb, heb ik twee identieke tabellen gemaakt in verschillende Schemas ServerA en ServerB .

Stapsgewijs proces:

  1. In de Connection manager sectie van de SSIS, maakt u twee OLE DB-verbindingen, namelijk ServerA en ServerB . Dit voorbeeld verwijst naar dezelfde server, maar in uw scenario moeten de verbindingen naar uw twee verschillende servers verwijzen. Zie screenshot #1 .

  2. Maak twee schema's ServerA en ServerB . Maak de tabel dbo.ItemInfo in beide schema's. Maak scripts voor deze tabellen worden gegeven onder Scripts sectie. Nogmaals, deze objecten zijn alleen voor dit voorbeeld.

  3. Ik heb beide tabellen gevuld met enkele voorbeeldgegevens. Tabel ServerA.ItemInfo bevat 2,222 rows en tabel ServerB.ItemInfo bevat 10,000 rows . Volgens de vraag, de ontbrekende 7.778 rijen moeten worden overgedragen van ServerB naar ServerA . Zie screenshot #2 .

  4. Plaats op het controlestroomtabblad van het SSIS-pakket een gegevensstroomtaak zoals weergegeven in screenshot #3 .

  5. Dubbelklik op de gegevensstroomtaak om naar het gegevensstroomtabblad te gaan en configureer de gegevensstroomtaak zoals hieronder beschreven. Server B is een OLE DB Source; Vind record op server A is een Lookup transformation task en Server A is een OLE DB Destination .

  6. Configureer OLE DB Source Server B zoals getoond in screenshots #4 en #5 .

  7. Configureer Lookup transformation task Vind record op server A zoals getoond in screenshots #6 - #8 . In dit voorbeeld is ItemId de unieke sleutel. Dat is dus de kolom die wordt gebruikt om te zoeken naar ontbrekende records tussen de twee tabellen. Omdat we alleen de rijen nodig hebben die niet bestaan ​​in Server A , moeten we de optie Redirect rows to no match output . selecteren .

  8. Plaats een OLE DB Destination op de gegevensstroomtaak. Wanneer u de Lookup-transformatietaak verbindt met OLE DB Destination, wordt u gevraagd met Input Output Selection dialoog. Selecteer Lookup No Match Output uit het dialoogvenster zoals weergegeven in screenshot #9 . Configureer de OLE DB Destination Server A zoals getoond in screenshots #10 en #11 .

  9. Zodra de gegevensstroomtaak is geconfigureerd, zou deze eruit moeten zien zoals weergegeven in screenshot #12 .

  10. Voorbeelduitvoering van het pakket wordt getoond in screenshot #13 . Zoals je kunt zien, zijn de ontbrekende 7,778 rows zijn overgebracht van Server B naar Server A . Zie screenshot #14 om het aantal tabelrecords te bekijken na de uitvoering van het pakket.

  11. Aangezien de vereiste was om alleen de ontbrekende records in te voegen, is deze aanpak gebruikt. Als u bestaande records wilt bijwerken en records wilt verwijderen die niet langer geldig zijn, raadpleeg dan het voorbeeld dat ik heb gegeven in deze link. SQL Integration Services om door tabs gescheiden bestand te laden? Het voorbeeld in de link laat zien hoe u een plat bestand naar SQL kunt overbrengen, maar het werkt bestaande records bij en verwijdert ongeldige records. Het voorbeeld is ook nauwkeurig afgestemd om een ​​groot aantal rijen te verwerken.

Ik hoop dat dat helpt.

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

Screenshot #1:

Screenshot #2:

Screenshot #3:

Screenshot #4:

Screenshot #5:

Screenshot #6:

Screenshot #7:

Screenshot #8:

Screenshot #9:

Screenshot #10:

Screenshot #11:

Schermafbeelding #12:

Screenshot #13:

Screenshot #14:




  1. Alfabetisch bestellen in SQL

  2. Door komma's gescheiden kolomgegevens in extra kolommen splitsen

  3. MySQL:Sorteren op veld, lege cellen aan het einde plaatsen

  4. Meerdere tafels selecteren vs. JOIN (prestaties)