Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SSIS – Verwenden eines Foreach-Schleifencontainers zum Aktualisieren von Datensätzen nach der Übertragung

Wahrscheinlich haben Sie inzwischen eine Antwort auf Ihre Frage gefunden. Diese Antwort soll anderen helfen, die auf diese Frage stoßen könnten. Hier ist eine mögliche Option, mit der die Datenübertragung per SSIS aufgelöst werden kann. Ich bin davon ausgegangen, dass Sie weiterhin Verbindungszeichenfolgen erstellen können, die auf Ihre beiden Server A und B aus dem SSIS-Paket verweisen. Wenn diese Annahme falsch ist, lassen Sie es mich bitte wissen, damit ich diese Antwort löschen kann. In diesem Beispiel verwende ich SQL Server 2008 R2 als Backend. Da ich keine zwei Server habe, habe ich zwei identische Tabellen in unterschiedlichen Schemas erstellt ServerA und ServerB .

Schritt-für-Schritt-Prozess:

  1. Im Connection manager Abschnitt des SSIS zwei OLE DB-Verbindungen erstellen, nämlich ServerA und ServerB . Dieses Beispiel verweist auf denselben Server, aber in Ihrem Szenario müssen die Verbindungen auf Ihre beiden unterschiedlichen Server verweisen. Siehe Screenshot Nr. 1 .

  2. Erstellen Sie zwei Schemas ServerA und ServerB . Erstellen Sie die Tabelle dbo.ItemInfo in beiden Schemata. Erstellungsskripte für diese Tabellen finden Sie unter Skripte Sektion. Auch diese Objekte sind nur für dieses Beispiel.

  3. Ich habe beide Tabellen mit einigen Beispieldaten gefüllt. Tabelle ServerA.ItemInfo enthält 2,222 rows und Tabelle ServerB.ItemInfo enthält 10,000 rows . Gemäß der Frage fehlen die 7.778 Zeilen sollten von ServerB übertragen werden zu ServerA . Siehe Screenshot #2 .

  4. Platzieren Sie auf der Registerkarte Ablaufsteuerung des SSIS-Pakets eine Datenflussaufgabe, wie in Screenshot Nr. 3 gezeigt .

  5. Doppelklicken Sie auf die Datenflussaufgabe, um zur Registerkarte „Datenfluss“ zu navigieren, und konfigurieren Sie die Datenflussaufgabe wie unten beschrieben. Server B ist eine OLE DB Source; Suchen Sie den Datensatz auf Server A ist eine Lookup transformation task und Server A ist ein OLE DB Destination .

  6. Konfigurieren Sie OLE DB Source Server B wie in Screenshots #4 gezeigt und #5 .

  7. Konfigurieren Sie die Lookup transformation task Suchen Sie den Datensatz auf Server A wie in Screenshots #6 gezeigt - #8 . In diesem Beispiel ist ItemId der eindeutige Schlüssel. Daher ist dies die Spalte, die verwendet wird, um nach fehlenden Datensätzen zwischen den beiden Tabellen zu suchen. Da wir nur die Zeilen benötigen, die auf Server A nicht vorhanden sind , müssen wir die Option Redirect rows to no match output auswählen .

  8. Platzieren Sie ein OLE DB Destination auf der Datenflusstask. Wenn Sie die Lookup-Umwandlungsaufgabe mit dem OLE DB-Ziel verbinden, werden Sie mit Input Output Selection aufgefordert Dialog. Wählen Sie Lookup No Match Output aus dem Dialog, wie in Screenshot #9 gezeigt . Konfigurieren Sie das OLE DB Destination Server A wie in Screenshots #10 gezeigt und #11 .

  9. Sobald die Datenflussaufgabe konfiguriert ist, sollte sie wie in Screenshot #12 aussehen .

  10. Beispielausführung des Pakets ist in Screenshot #13 gezeigt . Wie Sie sehen können, fehlen die 7,778 rows wurden von Server B übertragen zu Server A . Siehe Screenshot #14 um die Anzahl der Tabellendatensätze nach der Paketausführung anzuzeigen.

  11. Da die Anforderung darin bestand, nur die fehlenden Datensätze einzufügen, wurde dieser Ansatz verwendet. Wenn Sie vorhandene Datensätze aktualisieren und Datensätze löschen möchten, die nicht mehr gültig sind, beziehen Sie sich bitte auf das Beispiel, das ich in diesem link. SQL Integration Services zum Laden einer tabulatorgetrennten Datei? Das Beispiel im Link zeigt, wie eine Flatfile an SQL übertragen wird, aktualisiert jedoch vorhandene Datensätze und löscht ungültige Datensätze. Außerdem ist das Beispiel fein abgestimmt, um eine große Anzahl von Zeilen zu verarbeiten.

Hoffe das hilft.

Skripte

.

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 Nr. 2:

Screenshot 3:

Screenshot #4:

Screenshot Nr. 5:

Screenshot Nr. 6:

Screenshot #7:

Screenshot #8:

Screenshot Nr. 9:

Screenshot Nr. 10:

Screenshot Nr. 11:

Screenshot Nr. 12:

Screenshot Nr. 13:

Screenshot Nr. 14: