CiAgICA8IS0tIExpbmtlZEluIC0tPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIF9saW5rZWRpbl9wYXJ0bmVyX2lkID0gIjEyMzUwNzMiOwogICAgICAgIHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyA9IHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyB8fCBbXTsKICAgICAgICB3aW5kb3cuX2xpbmtlZGluX2RhdGFfcGFydG5lcl9pZHMucHVzaChfbGlua2VkaW5fcGFydG5lcl9pZCk7CiAgICA8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgKGZ1bmN0aW9uKCl7dmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiO2IuYXN5bmMgPSB0cnVlOwogICAgICAgICAgICBiLnNyYyA9ICJodHRwczovL3NuYXAubGljZG4uY29tL2xpLmxtcy1hbmFseXRpY3MvaW5zaWdodC5taW4uanMiOwogICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsIHMpO30pKCk7CiAgICA8L3NjcmlwdD4KICAgIDxub3NjcmlwdD4KICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBhbHQ9IiIgc3JjPSJodHRwczovL3B4LmFkcy5saW5rZWRpbi5jb20vY29sbGVjdC8/cGlkPTEyMzUwNzMmZm10PWdpZiIgLz4KICAgIDwvbm9zY3JpcHQ+CiAgICA8IS0tIEVuZCBMaW5rZWRJbiAtLT4KICAgIA==
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

SSIS: Mehrere Verbindungsmanager, ein Container

Es kommt mitunter vor, dass strukturgleiche Daten im Ladeprozess aus verschiedenen Datenquellen in das System überführt werden müssen.

Um hier nicht für jede Datenquelle einen eigenen Prozessschritt anlegen zu müssen, bietet sich die Möglichkeit an, in der Organisation der Dateneinspeisung einen Container zu verwenden, der einen Loop über die verschiedenen Quellen durchführt. Dabei werden die Connection Strings zunächst in eine Variable gespeichert und dann zur Laufzeit abgearbeitet. Die technische Umsetzung dieser Arbeitsersparnis wird im Folgenden dargestellt.

Zunächst benötigen wir eine kleine Tabelle in einer relationalen Datenbank, in welcher die beliebig vielen, verschiedenen Datenquellen hinterlegt werden können. Diese könnte in etwa folgendermaßen aussehen:

CREATE TABLE T_S_Verbindung (
VerbindungsID [smallint],
VerbindungBEZ [varchar](255)
)
GO

2012-09-14_crew_Tabelle
Zur Befüllung der Steuertabelle mit Werten eignet sich folgende Syntax:

INSERT INTO T_S_Verbindung
SELECT 1 VerbindungsID,
'Data Source=Server1;Initial Catalog=Datenbank1;Provider=SQLNCLI10.1;Integrated
Security=SSPI;Auto Translate=False;' VerbindungBEZ
GO

Sind die gewünschten Verbindungszeichenfolgen hinterlegt, so kann ein SSIS Task angelegt werden, um diese anzusteuern und letztendlich mittels einer Schleife auf die unterschiedlichen Datenquellen zuzugreifen.

Hierfür werden zunächst zwei Variablen benötigt. Eine vom Typ „Object“ für die Speicherung unseres Abfrageergebnisses und die zweite vom gewöhnlichen Typ „String“. In Letztere kann initial der erste Eintrag der zuvor angelegten Tabelle geschrieben werden, um eine Warnmeldung zu umgehen. Zur Laufzeit wird der Wert neu befüllt.

2012-09-14_crew_Tabelle_2

Als nächstes sind für unser Vorhaben dann zwei Verbindungsmanager notwendig.
2012-09-14_crew_Verbindungsmanager

Hier steht der Verbindungsmanager „Parameter und Ziel“ für eine gebräuchliche OLE-DB Verbindung zu jener Datenbank, in welcher wir unsere Steuertabelle T_S_Verbindung angelegt haben und in welcher idealerweise auch unsere später geladenen Zieldaten Verwendung finden.

2012-09-14_crew_Verbindungsmanager_2

Interessanter ist da schon der zweite Verbindungsmanager „Dynamische Verbindung“. Hier wird neben dem gewünschten Server und der Datenbank auch mittels Eigenschaftendialog eine Expression hinzugefügt, und zwar unsere zuvor angelegte Variable „User::Verbindungszeichenfolge“.

2012-09-14_crew_Expressions

Nachdem diese Vorbereitungen getroffen sind, gelangen wir an den eigentlichen Aufbau der SSIS Ablaufsteuerung und erstellen zunächst einen „SQL ausführen“ Task, hier namentlich mit „Verbindungszeichenfolgen lesen“ tituliert.

2012-09-14_crew_Verbindungszeichenfolgen lesen

2012-09-14_crew_SQL-Anweisung

Und die Zuordnung der Objektvariable an das erhaltene Resultset:

2012-09-14_crew_Resultset

Da die Verbindungszeichenfolgen im Folgenden aus der Variable „Quelle“ ausgelesen werden können, bedarf es nun eines neuen Prozessschrittes „ForEachSchleifencontainer“, um in einer Schleife die verschiedenen Verbindungen anzusprechen.

2012-09-14_crew_Forech-Schleifencontainer Datenquellen

Bei den Einstellungen des Schleifencontainers ist nun vor allem darauf zu achten, die Variablen richtig zu setzen. Als Enumerator ist hier der „Foreach-ADO-Enumerator“ auszuwählen und die zugehörige ADO-Objektquellvariable wird unsere Objektvariable „Quelle“.

2012-09-14_crew_Forech-Schleifen-Editor

Bei den Variablenzuordnungen ist dann der jeweilige String aus der Verbindungszeichenfolge auszulesen.

2012-09-14_crew_Variablen

Sind diese Einstellungen vorgenommen, kann in den zentralen Bauch des Schleifenablaufs ein herkömmlicher Datenfluss mit Quell- und Zielobjekten eingestellt werden.

2012-09-14_crew_Datenimport

Hier ist jedoch darauf zu achten, dass Quelle und Ziel in allen Verbindungsmanagern gleiche Struktur aufweisen. Ist dies nicht der Fall, so kann in unsere Steuertabelle ebenfalls auch noch das SQL einer Abfrage eingebaut werden, welche aus unterschiedlichen Tabellen die Inhalte in gleicher Form selektiert und an eine allgemeingültige Zieltabelle weitergibt. Dieses SQL wird dann zur Laufzeit ebenfalls über eine Variable in die zur jeweiligen Verbindungszeichenfolge gehörige Quelle geschrieben und gewährleistet somit weitere Flexibilität.