{"id":21,"date":"2008-09-05T21:13:00","date_gmt":"2008-09-05T20:13:00","guid":{"rendered":"http:\/\/csopro.de\/biblog\/2008\/09\/ssis-achtung-bei-gross-und-kleinschreibung-lookup\/"},"modified":"2014-12-31T18:31:56","modified_gmt":"2014-12-31T17:31:56","slug":"ssis-achtung-bei-gross-und-kleinschreibung-lookup","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2008\/09\/ssis-achtung-bei-gross-und-kleinschreibung-lookup\/","title":{"rendered":"SSIS: Achtung bei Gro\u00df- und Kleinschreibung &#8211; Lookup"},"content":{"rendered":"<p><a href=\"https:\/\/www.csopro.de\/biblog\/2008\/09\/ssis-achtung-bei-gross-und-kleinschreibung-aggregate\/\">Gestern<\/a> habe ich beschrieben, welche Unterschiede zwischen SQL Server und SSIS bei Gro\u00df- und Kleinschreibung bei der Aggregation zu beachten sind.<\/p>\n<p>Nat\u00fcrlich ist das Verhalten der beiden Produkte konsistent:<\/p>\n<ul>\n<li><strong>SQL Server<\/strong> unterscheidet grunds\u00e4tzlich (im Standard) <strong>nicht<\/strong> zwischen Gro\u00df- und Kleinschreibung<\/li>\n<li><strong>SSIS<\/strong> <strong>unterscheidet<\/strong> grunds\u00e4tzlich (im Standard) zwischen Gro\u00df- und Kleinschreibung<\/li>\n<\/ul>\n<p>Damit ist auch klar, dass andere Transformationen von Unterschieden betroffen sind. Heute betrachte ich die SSIS-Transformation Lookup (Suche):<\/p>\n<p>Als Beispiel verwende ich wieder die Tabelle Customers<\/p>\n<p><img decoding=\"async\" alt=\"Tabelle Customers\" hspace=\"0\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2008\/10\/tabellecustomers.jpg\" align=\"baseline\" border=\"0\" \/><\/p>\n<p>und die neue Tabelle Countries<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" height=\"125\" alt=\"tabelleCountries\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2008\/10\/tabellecountries.jpg\" width=\"199\" \/><\/p>\n<blockquote>\n<p><em>Eine Anmerkung zu diesem Beispiel: Die Verwendung von Strings f\u00fcr Schl\u00fcssel liefert mir ein einfaches Besipiel, soll aber nat\u00fcrlich nicht als Standard f\u00fcr die Datenmodellierung angesehen werden \ud83d\ude42<\/em><\/p>\n<\/blockquote>\n<p>Der SSIS-Data Flow soll nun alle Kunden mit zugeh\u00f6riger Hauptstadt ermitteln.<\/p>\n<p>Die Lookup-Transformation funktioniert auf zwei unterschiedliche Arten:<\/p>\n<ul>\n<li>komplettes Laden der Lookup-Tabelle (hier Countries) vor dem Start der Ausf\u00fchrung des eigentlichen Data Flows &#8211; dies ist der Standard<\/li>\n<li>Einzelnes Laden der nachzuschlagenden Datens\u00e4tze &#8211; wenn man unter dem 3. Reriter (Advanced) den Haken bei &#8222;Enable memory restriction&#8220; aktiviert.<\/li>\n<\/ul>\n<p>Ich beginne mit dem zweiten:<\/p>\n<h2>Einzelnes Laden der nachzuschlagenden Datens\u00e4tze:<\/h2>\n<p>Die Einstellungen f\u00fcr die einzelnen Reiter der Lookup-Transformation sind wie folgt:<\/p>\n<ul>\n<li>Reference Table: verwende Tabelle Countries<\/li>\n<li>Columns: Der Join geht \u00fcber Country &#8212; Country. Als zus\u00e4tzliche Spalte wird Capital ausgegeben<\/li>\n<li>Advanced: Wir setzen den Halen bei &#8222;Enable memory restriction&#8220;. Der Rest bleibt im Standard (keine weiteren Haken)<\/li>\n<\/ul>\n<p>Als Ergebnis erhalten wir:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" height=\"266\" alt=\"ErgebnisLookup2\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2008\/10\/ergebnislookupzweitevariante.jpg\" width=\"442\" \/><\/p>\n<p>Das liefert also das gew\u00fcnschte Ergebnis.<\/p>\n<p>Wie geht hier SSIS intern vor?<\/p>\n<p>F\u00fcr jede Zeile wird ein SQL-Statement ausgef\u00fchrt, das zu der Country die Capital dazuliest (Also z.B. SELECT * FROM Countries WHERE Country = &#8218;de&#8216;) [Das genaue SQL-Statement sieht man im Bereich &#8222;Caching SQL-Statement&#8220; auf dem 3. Reiter (Advanced)].<\/p>\n<p>Da der SQL Server nicht zwischen Gro\u00df- und Kleinschreibung unterscheidet, unterscheidet also auch diese Version der Lookup-Transformation nicht.<\/p>\n<p>Nat\u00fcrlich ist aber dieses Vorgehen bei gro\u00dfen Datenmengen imperformant, da f\u00fcr jede Zeile ein SQL-Select ausgef\u00fchrt wird. Daran \u00e4ndern auch die weiteren Optionen unter Advanced nichts (grundlegendes): Enable Caching w\u00fcrde nur verhindern, dass nicht zweimal dasselbe SQL-Statement ausgef\u00fchrt wird (Wenn also &#8222;de&#8220; in zwei Zeilen auftauchen w\u00fcrde). Der Cache selbst w\u00e4re im \u00fcbrigen wieder case-sensitive (D.h. unterscheidet zwischen Gro\u00df- und Kleinschreibung) &#8211; es w\u00fcrden also f\u00fcr &#8222;de&#8220; und &#8222;DE&#8220; zwei SELECTs ausgef\u00fchrt.<\/p>\n<p>Deswegen jetzt die Betrachtung der Standard-Methode des Lookups:<\/p>\n<h2>komplettes Laden der Lookup-Tabelle<\/h2>\n<p>Wir entfernen den Haken &#8222;Enable memory Restriction&#8220; im Tab &#8222;Advanced&#8220; und starten das Paket nochmals.<\/p>\n<p>Sofort erhalten wir einen Fehler, dass der Lookup keinen Treffer findet. Durch Erweitern des Data Flows sehen wir die nicht gefundenen Datens\u00e4tze:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" height=\"712\" alt=\"Bild\" src=\"https:\/\/www.csopro.de\/biblog\/wp-content\/uploads\/2008\/10\/bild-4.jpg\" width=\"351\" \/><\/p>\n<p>Wir sehen also, dass der Lookup im Standard Gro\u00df- und Kleinschreibung unterscheidet.<\/p>\n<p>Wie kann man dieses Problem umgehen?<\/p>\n<p>Man kann nat\u00fcrlich die verwendeten Spalten vor dem Zugriff auf Gro\u00dfbuchstaben konvertieren:<\/p>\n<ul>\n<li>Im SSIS durch das Einf\u00fcgen einer derived Column, die mittels UPPER( [Country]) entweder eine neue Spalte erzeugt oder die bestehende \u00fcberschreibt.<\/li>\n<li>Im SQL-Statement f\u00fcr den Referenz-SELECT durch UPPER(), z.B. SELECT Upper(Country) as CountryUpper, * from countries<\/li>\n<\/ul>\n<p>Nat\u00fcrlich gibt es noch andere M\u00f6glichkeiten zum Umgehen des Problems wie Fehlerhandling. Das erscheint mir hier aber konstruiert.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gestern habe ich beschrieben, welche Unterschiede zwischen SQL Server und SSIS bei Gro\u00df- und Kleinschreibung bei der Aggregation zu beachten sind. Nat\u00fcrlich ist das Verhalten der beiden Produkte konsistent: SQL Server unterscheidet grunds\u00e4tzlich (im Standard) nicht zwischen Gro\u00df- und Kleinschreibung SSIS unterscheidet grunds\u00e4tzlich (im Standard) zwischen Gro\u00df- und Kleinschreibung Damit ist auch klar, dass andere &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2008\/09\/ssis-achtung-bei-gross-und-kleinschreibung-lookup\/\" class=\"more-link\"><span class=\"screen-reader-text\">SSIS: Achtung bei Gro\u00df- und Kleinschreibung &#8211; Lookup<\/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-21","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\/21","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=21"}],"version-history":[{"count":1,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":276,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/21\/revisions\/276"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}