Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
SSIS Integration Runtime in Azure Data Factory
In de control flow van een Integration Services-pakket dat een incrementele lading wijzigingsdata uitvoert, is de derde en laatste taak het voorbereiden om de wijzigingsgegevens op te vragen en een Gegevensstroom-taak toe te voegen.
Note
De tweede taak voor de regelstroom is ervoor te zorgen dat de wijzigingsgegevens voor het geselecteerde interval klaar zijn. Voor meer informatie over deze taak, zie Bepaal of de wijzigingsgegevens klaar zijn. Voor een beschrijving van het algemene proces van het ontwerpen van de controleflow, zie Change Data Capture (SSIS).
Ontwerpoverwegingen
Om de wijzigingsgegevens op te halen, roep je een Transact-SQL tabel-waarde functie aan die de eindpunten van het interval als invoerparameters accepteert en veranderingsgegevens teruggeeft voor het opgegeven interval. Een broncomponent in de datastroom roept deze functie aan. Voor informatie over deze broncomponent, zie Retrieve and Understand the Change Data.
De meest gebruikte Integration Services-broncomponenten, waaronder de OLE DB-bron, de ADO-bron en de ADO NET-bron, kunnen geen parameterinformatie afleiden voor een tabelwaardige functie. Daarom kunnen de meeste bronnen een geparametriseerde functie niet direct aanroepen.
Je hebt twee ontwerpopties om de invoerparameters aan de functie door te geven:
Assembleer de geparametriseerde query als een string. Je kunt een Script-taak of een Execute SQL-taak gebruiken om een dynamische SQL-string samen te stellen met parameterwaarden die hardcoded in de string zijn verwerkt. Vervolgens kun je deze string opslaan in een package-variabele en deze gebruiken om de SqlCommand-eigenschap van een broncomponent in te stellen. Deze aanpak slaagt omdat de broncomponent geen parameterinformatie meer nodig heeft.
Note
Een vooraf gecompileerd script brengt minder overhead met zich mee dan een Execute SQL-taak.
Gebruik een geparametriseerde wrapper. Alternatief kun je een geparametriseerde opgeslagen procedure maken als een wrapper die de geparametriseerde tabel-waarde functie aanroept. Deze aanpak slaagt omdat een broncomponent met succes parameterinformatie kan afleiden voor een opgeslagen procedure.
Dit onderwerp gebruikt de eerste ontwerpoptie en stelt een geparametriseerde query samen als een string.
De Query voorbereiden
Voordat je de waarden van de invoerparameters kunt samenvoegen tot één querystring, moet je de pakketvariabelen instellen die de query nodig heeft.
Om pakketvariabelen in te stellen
In SQL Server Data Tools (SSDT) maakt u in het Variabelen-venster een variabele aan met een stringdatatype om de querystring te bevatten die door de Execute SQL Task wordt teruggegeven.
Dit voorbeeld gebruikt de variabelenaam SqlDataQuery.
Met de pakketvariabele aangemaakt, kun je een Script-taak of een Execute SQL-taak gebruiken om de waarden van de invoerparameters te combineren. De volgende twee procedures beschrijven hoe deze componenten geconfigureerd moeten worden.
Om een Script-taak te gebruiken om de querystring te verbinden
Voeg op het tabblad Control Flow een Script-taak toe aan het pakket na de For Loop-container en verbind de For Loop-container met de taak.
Note
Deze procedure gaat ervan uit dat het pakket een incrementele lading uitvoert vanuit één enkele tabel. Als het pakket uit meerdere tabellen laadt en een ouderpakket met meerdere kindpakketten heeft, wordt deze taak als eerste component toegevoegd aan elk kindpakket. Voor meer informatie, zie Uitvoeren van een incrementele lading van meerdere tabellen.
Selecteer in de Script Taakeditor op de Scriptpagina de volgende opties:
Voor ReadOnlyVariables selecteer User::D ataReady, User::ExtractStartTime en User::ExtractEndTime uit de.
Selecteer User::SqlDataQuery uit de lijst voor ReadWriteVariables.
In de Script Taakeditor klikt u op de Scriptpaginaop Script Bewerken om de scriptontwikkelomgeving te openen.
In de Hoofdprocedure voer je een van de volgende codesegmenten in:
Als je programmeert in C#, voer dan de volgende regels code in:
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;- of -
Als je programmeert in Visual Basic, voer dan de volgende regels code in:
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
Laat de standaard coderegel staan die DtsExecResult.Success teruggeeft bij het uitvoeren van het script.
Sluit de scriptontwikkelingsomgeving en de Script Taakeditor.
Om een Execute SQL-taak te gebruiken om de querystring aan elkaar te koppelen
Voeg op het tabblad Control Flow een Execute SQL-taak toe aan het pakket na de For Loop-container en verbind de For Loop-container met deze taak.
Note
Deze procedure gaat ervan uit dat het pakket een incrementele lading uitvoert vanuit één enkele tabel. Als het pakket uit meerdere tabellen laadt en een ouderpakket met meerdere kindpakketten heeft, wordt deze taak als eerste component toegevoegd aan elk kindpakket. Voor meer informatie, zie Uitvoeren van een incrementele lading van meerdere tabellen.
Selecteer in de Uitvoeren SQL Taakeditor op de algemene pagina de volgende opties:
Selecteer voor ResultSetEnkele rij.
Configureer een geldige verbinding met de brondatabase.
Selecteer voor SQLSourceType de optie Direct input.
Voor SQLStatement voer je de volgende SQL-instructie in:
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
De else-clausule in dit voorbeeld genereert een query voor de initiële lading van wijzigingsdata door een nulwaarde voor de startdatum en -tijd door te geven. Dit voorbeeld behandelt niet het scenario waarin wijzigingen die zijn aangebracht voordat change data capture werd ingeschakeld, ook naar het datawarehouse moeten worden geüpload.
Op de pagina Parametermapping van de Execute SQL Task Editor voert u de volgende mapping uit:
Koppel de DataReady-variabele aan parameter 0.
Koppel de variabele ExtractStartTime aan parameter 1.
Koppel de ExtractEndTime-variabele aan parameter 2.
Op de Result Set-pagina van de Execute SQL Task Editor koppel je de Result Name aan de SqlDataQuery-variabele.
De Resultaatnaam is de naam van de enkele kolom die wordt teruggegeven, SqlDataQuery.
De voorgaande procedures configureren een taak die een querystring voorbereidt met hardgecodeerde stringwaarden voor de invoerparameters. De volgende code is een voorbeeld van zo'n querystring:
select * from CDCSample. uf_Customer('2007-06-11 14:21:58', '2007-06-12 14:21:58')
Een Gegevensstroom-taak toevoegen
De laatste stap bij het ontwerpen van de control flow voor het pakket is het toevoegen van een Gegevensstroom-taak.
Om een Gegevensstroom-taak toe te voegen en de controleflow te voltooien
- Voeg op het tabblad Control Flow een Gegevensstroom-taak toe en verbind de taak die de querystring heeft samengevoegd.