Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
SSIS Integration Runtime i Azure Data Factory
I kontrollflödet i ett Integration Services-paket som utför en inkrementell belastning av ändringsdata är den tredje och sista uppgiften att förbereda för att söka efter ändringsdata och lägga till en Data Flow-uppgift.
Note
Den andra uppgiften för styrflödet är att säkerställa att förändringsdata för det valda intervallet är redo. För mer information om denna uppgift, se Bestäm om ändringsdata är redo. För en beskrivning av den övergripande processen att designa kontrollflödet, se Change Data Capture (SSIS).
Designöverväganden
För att hämta ändringsdata anropar du en Transact-SQL tabellvärdesfunktion som accepterar intervallets ändpunkter som indataparametrar och returnerar ändringsdata för det angivna intervallet. En källkomponent i dataflödet anropar denna funktion. För information om denna källkomponent, se Hämta och förstå förändringsdata.
De mest frekvent använda Integration Services-källkomponenterna, inklusive OLE DB-källan, ADO-källkoden och ADO NET-källan, kan inte härleda parameterinformation för en tabellvärdad funktion. Därför kan de flesta källor inte direkt anropa en parameteriserad funktion.
Du har två designalternativ för att skicka indataparametrarna till funktionen:
Sätt ihop den parameteriserade frågan som en sträng. Du kan använda en Script-uppgift eller en Execute SQL-uppgift för att sammanställa en dynamisk SQL-sträng med parametervärden hårdkodade i strängen. Sedan kan du lagra denna sträng i en paketvariabel och använda den för att sätta egenskapen SqlCommand för en källkomponent. Denna metod lyckas eftersom källkomponenten inte längre kräver parameterinformation.
Note
Ett förkompilerat skript medför mindre överhead än en Execute SQL-uppgift.
Använd en parameteriserad wrapper. Alternativt kan du skapa en parameteriserad lagrad procedur som en wrapper som anropar den parameteriserade tabellvärda funktionen. Denna metod lyckas eftersom en källkomponent framgångsrikt kan härleda parameterinformation för en lagrad procedur.
Detta ämne använder det första designalternativet och sammanställer en parameteriserad fråga som en sträng.
Förberedelse av frågan
Innan du kan sammanfoga värdena på indataparametrarna till en enda frågesträng måste du ställa in de paketvariabler som frågefrågan behöver.
För att ställa in paketvariabler
I SQL Server Data Tools (SSDT), i Variables-fönstret, skapa en variabel med en strängdatatyp för att hålla frågesträngen som returneras av Execute SQL Task.
Detta exempel använder variabelnamnet SqlDataQuery.
Med paketvariabeln skapad kan du använda antingen en Script-uppgift eller Execute SQL-uppgift för att sammanfoga värdena på indataparametrarna. Följande två procedurer beskriver hur dessa komponenter konfigureras.
Att använda en Script-uppgift för att sammanfoga frågesträngen
På fliken Control Flow , lägg till en Script-uppgift i paketet efter For Loop-containern och koppla For Loop-containern till uppgiften.
Note
Denna procedur förutsätter att paketet utför en inkrementell laddning från en enda tabell. Om paketet laddas från flera tabeller och har ett föräldrapaket med flera barnpaket, skulle denna uppgift läggas till som första komponent till varje barnpaket. För mer information, se Utför en inkrementell belastning av flera tabeller.
I Script Task Editor, på Skriptsidan , välj följande alternativ:
För ReadOnlyVariables, välj User::DataReady, User::ExtractStartTime och User::ExtractEndTime från.
För ReadWriteVariables, välj User::SqlDataQuery från listan.
I Script Task Editor, på Skriptsidan , klicka på Redigera Skript för att öppna skriptutvecklingsmiljön.
I huvudproceduren, ange ett av följande kodsegment:
Om du programmerar i C#, skriv in följande kodrader:
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;-eller-
Om du programmerar i Visual Basic, skriv in följande rader kod:
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
Lämna standardraden i koden som returnerar DtsExecResult.Success från exekveringen av skriptet.
Stäng skriptutvecklingsmiljön och Script Task Editor.
Att använda en Execute SQL-uppgift för att sammanfoga frågesträngen
På fliken Control Flow , lägg till en Execute SQL-uppgift i paketet efter For Loop-containern och koppla For Loop-containern till denna uppgift.
Note
Denna procedur förutsätter att paketet utför en inkrementell laddning från en enda tabell. Om paketet laddas från flera tabeller och har ett föräldrapaket med flera barnpaket, skulle denna uppgift läggas till som första komponent till varje barnpaket. För mer information, se Utför en inkrementell belastning av flera tabeller.
I Execute SQL Task Editor, på sidan Generellt , välj följande alternativ:
För ResultSet, välj Enkel rad.
Konfigurera en giltig anslutning till källdatabasen.
För SQLSourceType, välj Direct input.
För SQLStatement, ange följande SQL-sats:
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 SqlDataQueryNote
Else-klausulen i detta exempel genererar en fråga för den initiala laddningsladdningen av ändringsdata genom att skicka ett nollvärde för startdatum och tid. Detta exempel tar inte upp det scenario där ändringar som gjordes innan datainfångning aktiverades också måste laddas upp till datalagret.
På sidan Parameter Mapping i Execute SQL Task Editor, gör följande mappning:
Mappa DataReady-variabeln till parameter 0.
Mappa variabeln ExtractStartTime till parameter 1.
Mappa variabeln ExtractEndTime till parameter 2.
På sidan Result Set i Execute SQL Task Editor, mappa Resultatnamnet till variabeln SqlDataQuery.
Resultatnamnet är namnet på den enda kolumn som returneras, SqlDataQuery.
De tidigare procedurerna konfigurerar en uppgift som förbereder en frågesträng med hårdkodade strängvärden för indataparametrarna. Följande kod är ett exempel på en sådan frågesträng:
select * from CDCSample. uf_Customer('2007-06-11 14:21:58', '2007-06-12 14:21:58')
Lägga till en Data Flow-uppgift
Det sista steget i att designa kontrollflödet för paketet är att lägga till en Data Flow-uppgift.
För att lägga till en Data Flow-uppgift och slutföra kontrollflödet
- På fliken Control Flow lägger du till en Data Flow-uppgift och kopplar in den uppgift som sammanfogade frågesträngen.