Vorbereiten zur Abfrage der Änderungsdaten
In der Ablaufsteuerung eines Integration Services-Pakets, das ein inkrementelles Laden von Änderungsdaten ausführt, besteht der dritte und letzte Task darin, die Abfrage der Änderungsdaten vorzubereiten und einen Datenflusstask hinzuzufügen.
Hinweis |
---|
Beim zweiten Task für die Ablaufsteuerung muss sichergestellt werden, dass die Änderungsdaten für das ausgewählte Intervall bereit sind. Weitere Informationen zu diesem Task finden Sie unter Bestimmen, ob die Änderungsdaten bereit sind. Eine Beschreibung des Gesamtprozesses zum Entwerfen der Ablaufsteuerung finden Sie unter Verbessern des inkrementellen Ladens mit Change Data Capture. Vollständige End-to-End-Beispiele, die die Verwendung von Change Data Capture in Paketen veranschaulichen, finden Sie im Beispiel "Change Data Capture for Specified Interval Package" und im Beispiel "Change Data Capture since Last Request Package" unter Codeplex. |
Überlegungen zu Entwürfen
Wenn Sie die Änderungsdaten abrufen möchten, müssen Sie eine Transact-SQL-Tabellenwertfunktion aufrufen, die die Endpunkte des Intervalls als Eingabeparameter akzeptiert und für das angegebene Intervall Änderungsdaten zurückgibt. Eine Quellkomponente im Datenfluss ruft diese Funktion auf. Weitere Informationen zu dieser Quellkomponente finden Sie unter Abrufen und Verstehen der Änderungsdaten.
Die am häufigsten verwendeten Integration Services-Quellkomponenten, einschließlich der OLE DB-Quelle, der ADO-Quelle und der ADO NET-Quelle, können für eine Tabellenwertfunktion keine Parameterinformationen ableiten. Deshalb können die meisten Quellen eine parametrisierte Funktion nicht direkt aufrufen.
Ihnen stehen zwei Entwurfsoptionen zur Verfügung, um die Eingabeparameter an die Funktion zu übergeben:
Assemblieren Sie die parametrisierte Abfrage als Zeichenfolge. Sie können einen Skripttask oder einen Task "SQL ausführen" verwenden, um eine dynamische SQL-Zeichenfolge mit Parameterwerten hartcodiert in die Zeichenfolge zu assemblieren. Sie können dann diese Zeichenfolge in einer Paketvariablen speichern und diese verwenden, um die SqlCommand-Eigenschaft einer Quellkomponente festzulegen. Dieser Ansatz ist erfolgreich, da die Quellkomponente nicht länger Parameterinformationen benötigt.
Hinweis Ein vorkompiliertes Skript verursacht weniger Aufwand als ein Task "SQL ausführen".
Verwenden Sie einen parametrisierten Wrapper. Alternativ können Sie eine parametrisierte gespeicherte Prozedur als Wrapper erstellen, der die parametrisierte Tabellenwertfunktion aufruft. Dieser Ansatz ist erfolgreich, da eine Quellkomponente Parameterinformationen für eine gespeicherte Prozedur erfolgreich ableiten kann.
Dieses Thema verwendet die erste Entwurfsoption und assembliert eine parametrisierte Abfrage als Zeichenfolge.
Vorbereiten der Abfrage
Bevor Sie die Werte der Eingabeparameter in eine einzelne Abfragezeichenfolge verketten können, müssen Sie die für die Abfrage erforderlichen Paketvariablen einrichten.
So richten Sie Paketvariablen ein
Erstellen Sie in Business Intelligence Development Studio im Fenster Variablen eine Variable mit einem Zeichenfolgen-Datentyp, damit die Abfragezeichenfolge durch den Task "SQL ausführen" zurückgegeben wird.
In diesem Beispiel wird der Variablenname "SqlDataQuery" verwendet.
Wenn die Paketvariable erstellt wurde, können Sie einen Skripttask oder einen Task "SQL ausführen" verwenden, um die Werte der Eingabeparameter zu verketten. Die folgenden zwei Prozeduren beschreiben, wie diese Komponenten konfiguriert werden.
So verwenden Sie einen Skripttask zur Verkettung der Abfragezeichenfolge
Fügen Sie dem Paket auf der Registerkarte Ablaufsteuerung nach dem For-Schleifencontainer einen Skripttask hinzu, und verbinden Sie den For-Schleifencontainer mit dem Task.
Hinweis In dieser Prozedur wird davon ausgegangen, dass das Paket ein inkrementelles Laden von einer einzelnen Tabelle ausführt. Wenn das Paket aus mehreren Tabellen lädt und ein übergeordnetes Paket mit mehreren untergeordneten Paketen hat, würde dieser Task jedem untergeordneten Paket als erste Komponente hinzugefügt werden. Weitere Informationen finden Sie unter Ausführen eines inkrementellen Ladens von mehreren Tabellen.
Aktivieren Sie im Skripttask-Editor auf der Seite Skript die folgenden Optionen:
Wählen Sie für ReadOnlyVariables die Optionen User::DataReady, User::ExtractStartTime und User::ExtractEndTime aus.
Wählen Sie für ReadWriteVariables die Option User::SqlDataQuery aus der Liste aus.
Klicken Sie im Skripttask-Editor auf der Seite Skript auf Skript bearbeiten, um die Skriptentwicklungsumgebung zu öffnen.
Geben Sie in der Main-Prozedur eines der folgenden Codesegmente ein:
Wenn Sie in C# programmieren, geben Sie die folgenden Codezeilen ein:
int dataReady; System.DateTime extractStartTime; System.DateTime extractEndTime; string sqlDataQuery; dataReady = (int)Dts.Variables["DataReady"].Value; extractStartTime = (System.DateTime)Dts.Variables["ExtractStartTime"].Value; extractEndTime = (System.DateTime)Dts.Variables["ExtractEndTime"].Value; if (dataReady == 2) { sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer('" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractStartTime) + "', '" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) + "')"; } else { sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer(null" + ", '" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) + "')"; } Dts.Variables("SqlDataQuery").Value = sqlDataQuery;
- Oder -
Wenn Sie in Visual Basic programmieren, geben Sie die folgenden Codezeilen ein:
Dim dataReady As Integer Dim extractStartTime As Date Dim extractEndTime As Date Dim sqlDataQuery As String dataReady = CType(Dts.Variables("DataReady").Value, Integer) extractStartTime = CType(Dts.Variables("ExtractStartTime").Value, Date) extractEndTime = CType(Dts.Variables("ExtractEndTime").Value, Date) If dataReady = 2 Then sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer('" & _ String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractStartTime) & _ "', '" & _ String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) & _ "')" Else sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer(null" & _ ", '" & _ String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) & _ "')" End If Dts.Variables("SqlDataQuery").Value = sqlDataQuery
Verlassen Sie die Standardcodezeile, die DtsExecResult.Success aus der Ausführung des Skripts zurückgibt.
Schließen Sie die Skriptentwicklungsumgebung und den Skripttask-Editor.
So verwenden Sie einen Task "SQL ausführen" zur Verkettung der Abfragezeichenfolge
Fügen Sie dem Paket auf der Registerkarte Ablaufsteuerung nach dem For-Schleifencontainer einen Task "SQL ausführen" hinzu, und verbinden Sie den For-Schleifencontainer mit diesem Task.
Hinweis In dieser Prozedur wird davon ausgegangen, dass das Paket ein inkrementelles Laden aus einer einzelnen Tabelle ausführt. Wenn das Paket aus mehreren Tabellen lädt und ein übergeordnetes Paket mit mehreren untergeordneten Paketen hat, würde dieser Task jedem untergeordneten Paket als erste Komponente hinzugefügt werden. Weitere Informationen finden Sie unter Ausführen eines inkrementellen Ladens von mehreren Tabellen.
Aktivieren Sie im Skripttask-Editor auf der Seite Skript die folgenden Optionen:
Wählen Sie für ResultSet die Option Einzelne Zeile aus.
Konfigurieren Sie zur Quelldatenbank eine gültige Verbindung.
Wählen Sie für SQLSourceType die Option Direkteingabe aus.
Geben Sie für SQLStatement die folgende SQL-Anweisung ein:
declare @ExtractStartTime datetime, @ExtractEndTime datetime, @DataReady int select @DataReady = ?, @ExtractStartTime = ?, @ExtractEndTime = ? if @DataReady = 2 select N'select * from CDCSample.uf_Customer' + N'('''+ convert(nvarchar(30),@ExtractStartTime,120) + ''', ''' + convert(nvarchar(30),@ExtractEndTime,120) + ''') ' as SqlDataQuery else select N'select * from CDCSample.uf_Customer' + N'(null, ''' + convert(nvarchar(30),@ExtractEndTime,120) + ''') ' as SqlDataQuery
Hinweis Die else-Klausel in diesem Beispiel generiert eine Abfrage für das erste Laden der Änderungsdaten, indem für das Startdatum und die Startzeit ein NULL-Wert übergeben wird. Dieses Beispiel befasst sich nicht mit dem Szenario, in dem Änderungen, die vor der Aktivierung von Change Data Capture vorgenommen wurden, auch ins Data Warehouse hochgeladen werden müssen.
Nehmen Sie auf der Seite Parameterzuordnung vom Editor für den Task 'SQL ausführen' die folgende Zuordnung vor:
Ordnen Sie dem Parameter 0 die DataReady-Variable zu.
Ordnen Sie dem Parameter 1 die ExtractStartTime-Variable zu.
Ordnen Sie dem Parameter 2 die ExtractEndTime-Variable zu.
Ordnen Sie auf der Seite Resultset vom Editor für den Task 'SQL ausführen' der SqlDataQuery-Variablen den Ergebnisnamen zu.
Der Ergebnisname ist der Name der einzelnen Spalte, die zurückgegeben wird, SqlDataQuery.
Die oben beschriebenen Prozeduren konfigurieren einen Task, der eine Abfragezeichenfolge mit hartcodierten Zeichenfolgewerten für die Eingabeparameter vorbereitet. Der folgende Code ist ein Beispiel für eine solche Abfragezeichenfolge:
select * from CDCSample. uf_Customer('2007-06-11 14:21:58', '2007-06-12 14:21:58')
Hinzufügen eines Datenflusstasks
Das Hinzufügen eines Datenflusstasks ist der letzte Schritt beim Entwerfen einer Ablaufsteuerung für ein Paket.
So fügen Sie einen Datenflusstask hinzu und vervollständigen Sie die Ablaufsteuerung
- Fügen Sie auf der Registerkarte Ablaufsteuerung einen Datenflusstask hinzu, und verbinden Sie den Task, der die Abfragezeichenfolge verkettet hat.
Nächster Schritt
Nach der Vorbereitung der Abfragezeichenfolge und der Konfiguration des Datenflusstasks besteht der nächste Schritt darin, die Tabellenwertfunktion zu erstellen, mit der die Änderungsdaten von der Datenbank abgerufen werden.
Nächstes Thema:Erstellen der Funktion zum Abrufen der Änderungsdaten
|