{"id":174,"date":"2010-04-11T18:02:33","date_gmt":"2010-04-11T17:02:33","guid":{"rendered":"http:\/\/csopro.de\/biblog\/2010\/04\/selects-beim-lookup-dynamisch-zusammenstellen\/"},"modified":"2014-12-31T18:28:39","modified_gmt":"2014-12-31T17:28:39","slug":"selects-beim-lookup-dynamisch-zusammenstellen","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2010\/04\/selects-beim-lookup-dynamisch-zusammenstellen\/","title":{"rendered":"SELECTS beim Lookup dynamisch zusammenstellen"},"content":{"rendered":"<p>Manchmal reicht es nicht aus, feste SQL-Statements als Quelle oder bei Lookups zu hinterlegen.<\/p>\n<p>Bei einer OLE-DB-Quelle kann man ganz einfach das SQL-Statement in einer Variable ablegen.<\/p>\n<p>Wie man das auch bei Lookups machen kann, zeigt dieser Eintrag.<\/p>\n<p>Zun\u00e4chst zur <u>Motivation<\/u>:<\/p>\n<p>Man k\u00f6nnte sich vorstellen, dass innerhalb eines Datenflusstasks immer nur Daten eines Tages in eine Tabelle geschrieben werden. Der Tag steht dabei in einer Variablen. Nun soll bei jedem Lookup \u00fcberpr\u00fcft werden, ob der Primary Key der Daten an diesem Tag schon in einer Tabelle steht. Da der Lookup alle Daten cacht, macht es Sinn nur die Daten des Datums aus der Variablen zu lesen.<\/p>\n<p>In unserem Beispiel hei\u00dft die Variable &#8222;Tag_deutsch&#8220; und speichert das Datum als String mit deutschem Datumsformat.<\/p>\n<p>Das Lookup-SQL m\u00fcsste also so aussehen:<\/p>\n<blockquote>\n<p>select * from ZahlenProTag<br \/>\nWhere Tag = CONVERT(date, &#39;7.5.2010&#39;, 104)<\/p>\n<\/blockquote>\n<p>oder allgemein<\/p>\n<blockquote>\n<p>select * from ZahlenProTag<br \/>\nWhere Tag = CONVERT(date, &#39;&lt;Inhalt der Variablen Tag_deutsch&gt;&#39;, 104)<\/p>\n<\/blockquote>\n<p>Deswegen legen wir eine berechnete (EvaluateAsExpression:=true) Variable &#8222;Lookup-SQL&#8220; an, mit der Expression:<\/p>\n<blockquote>\n<p>&quot;select * from ZahlenProTag<br \/>\nWhere Tag = CONVERT(date, &#39;&quot; + @[User::Tag_deutsch] + &quot;&#39;, 104)&quot;<\/p>\n<\/blockquote>\n<p>Jetzt bauen wir erst mal unseren Data Flow Task, noch mit dem kompletten Lookup auf ZahlenProTag:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"BeispielDataFlow\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/beispieldataflow.jpg\" width=\"369\" height=\"319\" \/><\/p>\n<p>Zu den einzelnen Komponenten:<\/p>\n<ul dir=\"ltr\">\n<li>\n<div>alle Zahlen von 1 bis 10 habe ich bereits in meinem letzten Blogeintrag verwendet (s. <a href=\"https:\/\/www.csopro.de\/biblog\/2010\/04\/temporaere-tabellen-in-ssis-verwenden\/\">https:\/\/www.csopro.de\/biblog\/2010\/04\/temporaere-tabellen-in-ssis-verwenden\/<\/a>). Es liefert alle Zahlen von 1 bis 10<\/div>\n<\/li>\n<li>\n<div>Eine abgeleitete Spalte mit dem Namen Datum wird hinzugef\u00fcgt, mit folgender Formel:<br \/>\n(DT_DBDATE)@[User::Tag_deutsch]<br \/>\nACHTUNG. Dabei muss als LocaleID deutsch eingestellt sein, da der String ja in deutschem Datumsformat steht<\/div>\n<\/li>\n<li>\n<div>Der Lookup sieht auf dem ersten Tab so aus:<br \/>\n<img loading=\"lazy\" decoding=\"async\" alt=\"LookupAllgemein\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/lookupallgemein.jpg\" width=\"450\" height=\"431\" \/><br \/>\nund so auf dem zweiten:<br \/>\n<img loading=\"lazy\" decoding=\"async\" alt=\"LookupVerbindung\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/lookupverbindung.jpg\" width=\"308\" height=\"286\" \/><br \/>\nund so auf dem dritten:<br \/>\n<img loading=\"lazy\" decoding=\"async\" alt=\"LookupSpalten\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/lookupspalten.jpg\" width=\"404\" height=\"378\" \/><br \/>\nMan beachte, dass zum Lookup nur die Zahl und nicht das Datum verwendet wird.<br \/>\nLetzteres k\u00f6nnte man nat\u00fcrlich machen. Dann w\u00fcrde aber die gesamte Tabelle in den Cache geladen werden, obwohl wir wissen, dass nur ein kleiner Bruchteil ben\u00f6tigt wird.<\/div>\n<\/li>\n<li>\n<div>Das OLE-DB-Ziel ist wieder naheliegend:<br \/>\nTab 1:<br \/>\n<img loading=\"lazy\" decoding=\"async\" alt=\"ZielVerbindung\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/zielverbindung.jpg\" width=\"359\" height=\"339\" \/><br \/>\nTab 2:<br \/>\n<img loading=\"lazy\" decoding=\"async\" alt=\"ZielZuordnungen\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/zielzuordnungen.jpg\" width=\"404\" height=\"408\" \/><\/div>\n<\/li>\n<\/ul>\n<p>Soweit so gut.<\/p>\n<p>Nun wollen wir das Lookup-SQL auf die oben angelegte Variable umstellen. Dazu gehen wir in die Ablaufsteuerung \/ Workflow und selektieren den Datenfluss-Task, so dass wir im Eigenschaftsfenster dessen Eigenschaften sehen.<\/p>\n<p>Dort f\u00e4llt auf, dass es unter Sonstiges eine Eigenschaft mit dem Titel [Zahl an diesem Tag schon da?].[SqlCommand] gibt:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"SqlCommand\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/sqlcommand.jpg\" width=\"443\" height=\"210\" \/><\/p>\n<p>[Zahl an diesem Tag schon da?] ist ja der Name der Lookup-Komponente.<\/p>\n<p>SqlCommand gibt das SQL an, das zum Bef\u00fcllen des Caches verwendet wird (wir hatten ja den Standard Vollcache belassen)<\/p>\n<p>SqlCommandParam w\u00fcrde man nur bei den anderen Cache-Typen ben\u00f6tigen.<\/p>\n<p>Nun k\u00f6nnen wir \u00fcber Expressions des Data Flow Tasks diese Eigenschaft \u00fcberschreiben:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"Expressions\u00dcberschreiben\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2010\/04\/expressionsueberschreiben.jpg\" width=\"438\" height=\"498\" \/><\/p>\n<p>So jetzt geht&#8217;s!<\/p>\n<p>Im Status bzw. Protokoll kann man kontrollieren, wieviele Zeilen der Lookup gecacht hat:<\/p>\n<blockquote>\n<p>[Zahl an diesem Tag schon da? [13]] Informationen: &#8218;Komponente &#8218;Zahl an diesem Tag schon da?&#8216; (13)&#8216; hat insgesamt 0 Zeilen zwischengespeichert.<\/p>\n<\/blockquote>\n<p>Diese Zeile kommt, wenn man die Variable auf ein neues Datum stellt.<\/p>\n<p>Wenn die Variable auf einem bereits verwendeten Datum steht, kommt:<\/p>\n<blockquote>\n<p>[Zahl an diesem Tag schon da? [13]] Informationen: &#8218;Komponente &#8218;Zahl an diesem Tag schon da?&#8216; (13)&#8216; hat insgesamt 10 Zeilen zwischengespeichert.<\/p>\n<\/blockquote>\n<p>Also ist alles OK!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Manchmal reicht es nicht aus, feste SQL-Statements als Quelle oder bei Lookups zu hinterlegen. Bei einer OLE-DB-Quelle kann man ganz einfach das SQL-Statement in einer Variable ablegen. Wie man das auch bei Lookups machen kann, zeigt dieser Eintrag. Zun\u00e4chst zur Motivation: Man k\u00f6nnte sich vorstellen, dass innerhalb eines Datenflusstasks immer nur Daten eines Tages in &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2010\/04\/selects-beim-lookup-dynamisch-zusammenstellen\/\" class=\"more-link\"><span class=\"screen-reader-text\">SELECTS beim Lookup dynamisch zusammenstellen<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[16],"class_list":["post-174","post","type-post","status-publish","format-standard","hentry","category-integrationservices","tag-lookup"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/comments?post=174"}],"version-history":[{"count":1,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/174\/revisions"}],"predecessor-version":[{"id":270,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/174\/revisions\/270"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}