Home
Datenquellen
Controllflow
DataFlow
SSIS
ToC
Impressum
 

Ein Resultset mit dem Foreach-Schleifencontainer zerlegen

Die Task Foreach-Schleifencontainer (Foreach-Loop Task) kann dazu verwendet werden, um alle Zeilen in einem Resultset einzeln zu verarbeiten.

Wenn Sie eine Datenbank vom SQL Server 7.0 oder 2000 auf den SQL Server 2005 migrieren sollten Sie nach der Migration die Statistiken aktualisieren.

In dem Beispielpaket werden für alle Benutzerdatenbanken, also nicht die Master, Model, TempDB und MSDB, die Statistiken mit sp_updatestats aktualisiert.
Zusätzlich wird für jede Datenbank der Befehl DBCC UPDATEUSAGE ausgeführt.

Dies sollte nach der Migration von SQL Server 7.0 oder 2000 einmal für jede Datenbank ausgeführt werden.

Überblick
Zuerst wird mit Hilfe einer SQL ausführen Task ein Resultset mit allen Namen der Benutzerdatenbanken gefüllt. Dieses Resultset wird dann mit Hilfe des Foreach-Schleifencontainers in einzelne Zeilen zerlegt. Im Container baut eine Scripttask die entsprechenden SQL Befehle zusammen die dann anschließend mit einer SQL ausführen Task ausgeführt werden.

Bitte beachten Sie, dass bei größeren Datenbanken die beiden Befehle einige Zeit und Ressourcen in Anspruch nehmen. Außerdem werden Änderungen an den Statistiken in der Datenbank ausgeführt.

Deshalb sollten Sie das Paket nicht in Ihrer produktiven Umgebung ohne Tests ausführen.
Für Probleme in Ihrer produktiven Umgebung kann ich nicht haften.

Das entsprechende Demopaket finden Sie hier.



Die einzelnen Schritte:

Schritt 1: Variablen definieren
Erstellen Sie bitte eine Variable mit der Sichtbarkeit für das ganzes Paket mit dem Namen rsAllUserDB. Das erreichen Sie dadurch, dass Sie die Arbeitsfläche auswählen und dann die Variable definieren. Es darf keine Task oder kein Container explizit ausgewählt sein. Als Datentyp wird Object ausgewählt.



Schritt 2: Task SQL ausführen
Nachdem ein OLE DB Verbindungs-Manager für den entsprechenden Server erstellt wurde, kann dieser in der Task Sql ausführen bei Connection ausgewählt werden. Selbstverständlich können Sie auch einen Verbindungs-Manager für ADO.Net erstellen und diesen verwenden. In diesem Fall muss allerdings der ConnectionType auf ADO.Net umgestellt werden.
Unter SQLStatement wird der entsprechende SQL Befehl eingegeben. Für das Beispiel wird
select [name] as DatabaseName from sys.databases where database_id > 4
verwendet.
Damit das Resultset weiter verwendet werden kann, muss die Eigenschaft ResultSet auf Vollständiges Resultset umgestellt werden.



Da keine Parameter für den SQL-Befehl verwendet werden, kann der Punkt Parameterzuordnung übersprungen werden.

Unter dem Punkt Resultset wird unter Ergebnisname die Ziffer 0 eingetragen.

Beim Punkt Variablenname wird der Name der Variable Benutzer::rsAllUserDB eingetragen oder ausgewählt. Diese Variable wurde im Schritt 1 definiert.

Falls die Variable noch nicht definiert wurde, so kann Sie auch hier direkt definiert werden. Bitte bedachten Sie dabei, dass der Container (Sichtbarkeitsbereich) das ganze Paket ist. Dies wird standardmäßig vorgeblendet.

Nach dem Ausführen der Task SQL ausführen enthält diese Variable das komplette Resultset.

Schritt 3: Foreach-Schleifencontainer
Der Foreach-Schleifencontainer wird in die Ablaufsteuerung gezogen. Der grüne Verbinder wird von der Task SQL ausführen zum Foreach-Schleifencontainer gezogen. So wird eine feste Reihenfolge zwischen den Tasks erreicht.

Damit die Werte jeder Spalte und Zeile in eine Variable gespeichert werden kann, werden zusätzlich Variablen benötigt. Dazu wird der Foreach-Schleifencontainer ausgewählt und über das Menü SSIS - Variablen ausgeführt. Jetzt können die Variablen definiert werden, die allerdings nur einen Sichtbarkeitsbereich innerhalb des Foreach-Schleifencontainers haben.

Es ist auch möglich, die Variablen direkt im Foreach-Schleifencontainer zu definieren.
In diesem Fall ist der Defaultwert für die Sichtbarkeit (Container) - sichtbar innerhalb des ganzen Pakets - leider nicht optimal eingestellt. Besser ist, die Sichtbarkeit auf den Foreach-Schleifencontainer zu begrenzen.

 

Im Beispiel werden zwei Variablen vom Typ String definiert. Die erste Spalte DatabaseName bekommt den Index 0, für jede weitere Spalte wird der Index um eins erhöht. Falls es notwendig ist, kann der Wert einer Spalte mehr als einer Variablen zugewiesen werden.



Schritt 4: Variablen definieren

Eine Variable vom Typ String und dem Sichtbarkeitsbereich Foreach-Schleifencontainer mit dem Namen SQL wird erzeugt.


 

Schritt 5: Scripttask
Die Aufgabe dieser Scripttask ist es, mit Hilfe der Werte in den Variablen zwei gültige SQL Befehle zu erstellen.
Unter dem Punkt Script ReadOnlyVariables wird die Variable DatabaseName an die Scriptfunktion übergeben.

Wenn der Variablenname eindeutig im Sichtbarkeitsbereich ist, ist es nicht notwendig den Namespace Benutzer mit anzugeben.

Zusätzlich wird die Systemvariable InteractiveMode and die Funktion übergeben.

Unter dem Punkt ReadWriteVariables wird die Variable SQL eingetragen, die beim Schritt 4 erzeugt wurde.

Wird die Schaltfläche Script entwerfen betätigt, so wird die Entwicklungsumgebung für VB.Net geöffnet.

Als Besonderheit möchte ich Sie darauf hinweisen, dass in Abhängigkeit des Wertes der Variable InteractiveMode eine Messagebox angezeigt wird. Die Systemvariable InteractiveMode ist immer TRUE wenn das SSIS Paket im SQL Server Business Intelligence Developer Studio (BIDS), sprich im Debugmode, ausgeführt wird. Starten Sie das Paket über DTExex, DTExecUI oder mit Steuerung F5 im BIDS, so ist diese Systemvariable immer FALSE. So kann ganz einfach Debugcode in die Funktionalität der Funktion eingebaut werden, der die Ausführung nicht stört.

In der Funktion wird einfach mit Hilfe der Variable DatabaseName die SQL Anweisung zusammengebaut und in die Variable SQL gespeichert.



Schritt 6: Task SQL ausführen
Als letzte Task wird nochmals eine SQL ausführen Task in den Foreach-Schleifencontainer gezogen. Auch hier wird der grüne Pfeil von der Scripttask zur SQL ausführen Task gezogen.

Unter dem Punkt Allgemein wird unter Connection der Verbindungs-Manager eingetragen. Als SQLSourceType wird der Wert Variable ausgewählt. Bei Punkt SourceVariable wird die Variable Benutzer::SQL ausgewählt.

Zusammenfassung
Mit diesem einfachen Beispiel können Sie die notwendigen Verarbeitungsschritt nachvollziehen, die notwendig sind, wenn eine Resultset in der Ablaufsteuerung zeilenweise zerlegt und verarbeitet werden soll.

Hier finden Sie das entsprechende Demopaket.

Bitte passen Sie den Verbindungs-Manager an Ihre Umgebung an.

Komponentenindex:

  • Foreach-Schleifencontainer
  • Script Task
  • SQL ausführen Task

erstellt am 16.4.2006