In Integration Services kan het voorkomen dat je SQL in je Dataflowtask dynamisch wilt opbouwen door gebruik te maken van een variabele. Om dit voor elkaar te krijgen in een truukje nodig.
Je zou verwachten dat je in je OLEDB Source een statement kunt typen als SELECT * FROM Sales WHERE DatumID = ? en dan een parameter koppelen aan de variabele. Vandaag heb ik geconstateerd dat dit niet werkt. Hieronder een workaround.
Probleemstelling
We willen een dynamische SQL statement opbouwen in een OLEDB Source die de data uit een tabel ophaalt voor de datum van vandaag. Deze datum van vandaag is een integerveld, 20090225 (dus geen datetime). Dit doen we in verband met het vergelijken van datums. Als je met datetime-velden werkt moeten ook de minuten/uren gelijk zijn als je deze met elkaar vergelijkt, bij integers heb je dat probleem niet.
Stap 1
Maak een variabele aan op packageniveau (scope) van het type Int32. Noem deze variabele: VandaagDatumID. Klik op de variabele en druk F4 zodat het properties-scherm verschijnt. Zet EvaluateAsExpression op TRUE en vul daaronder de volgende expressie in: YEAR(getdate() ) * 10000 + Month(getdate() ) * 100 + DAY(getdate()) . Deze expressie zet de datumwaarde van vandaag om in een integerveld.
Stap 2
Maak nog een variabele aan met de Dataflowtask als scope. Doe je dit niet dan werkt het niet. Noem de variabele SourceSQL. Klik weer op F4, zet EvaluateAsExpression op TRUE en type in de expressie het SQL statement dat de data moet ophalen. Typ alles achter elkaar op 1 regel, bijvoorbeeld: SELECT OrderBedrag, OrderNummer FROM FactOrders WHERE OrderDatumID = ” + (DT_WSTR,12)@[User::VandaagDatumID] .
Stap 3
Ga naar de OLEDB Source in de Dataflowtask en vul in bij Data Access Mode: SQL Command from Variable. Kies daaronder de variabele. Kun je geen variable kiezen dan staat de scope niet goed ingesteld.
Dat was het voor zover.