<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ixto-Blog &#187; Chris Jacob</title>
	<atom:link href="http://www.ixto.de/blog/author/cjacob/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ixto.de/blog</link>
	<description>Business Intelligence, Database Consulting, Software Development</description>
	<lastBuildDate>Mon, 26 Sep 2011 09:23:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Jahreswerte auf Monate verlustfrei verteilen &#8211; Teil 1</title>
		<link>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/jahreswerte-auf-monate-verlustfrei-verteilen-teil-1/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/jahreswerte-auf-monate-verlustfrei-verteilen-teil-1/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 09:15:00 +0000</pubDate>
		<dc:creator>Chris Jacob</dc:creator>
				<category><![CDATA[Integration Services 2005]]></category>
		<category><![CDATA[Integration Services 2008]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=510</guid>
		<description><![CDATA[Ich habe wieder ein schönes Beispiel gefunden an der man die Flexibilität der Integration Services demonstrieren kann. Die Aufgabe ist recht einfach: es geht darum, einen Jahreswert mit Dezimalstellen (in unserem Fall ein numeric(6,2), z.B. ein Euro-Wert) gleichmäßig auf 12 Monate zu verteilen. Die Division sollte uns hoffentlich keine Kopfschmerzen bereiten, die Herausforderung liegt darin, [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe wieder ein schönes Beispiel gefunden an der man die Flexibilität der Integration Services demonstrieren kann. Die Aufgabe ist recht einfach: es geht darum, einen Jahreswert mit Dezimalstellen (in unserem Fall ein numeric(6,2), z.B. ein Euro-Wert) gleichmäßig auf 12 Monate zu verteilen. Die Division sollte uns hoffentlich keine Kopfschmerzen bereiten, die Herausforderung liegt darin, dass unser Datentyp nur zwei Nachkommastellen erlaubt und daher viele Werte bei der Division einen Genauigkeitsverlust erleiden würden.<br />
<span id="more-510"></span><br />
Ein kurzes Beispiel: teilen wir den Wert 100,00 € durch 12 erhalten wir pro Monat einen Wert von 8,3333. € Würden wir nun 12 mal den Wert 8,33 € als Monatswert in unsere Datenbank übernehmen, würden uns über das Jahr hinweg gesehen 0,04 € fehlen. Das Ziel wäre hier, diese 4 Eurocent (also den Differenzbetrag) auf den letzten Monat aufzuschlagen.</p>
<p>&#160;</p>
<p>Das Problem begegnet uns immer dann, wenn in der Datenbank Werte in einer anderen Granularität gespeichert werden (in diesem Fall monatsgenau) als diese von der darauf aufsetzenden Anwendung geliefert werden (diese erlaubt nur jahresgenaue Werte). Für spätere Auswertungen oder Änderungen möchten wir monatsgenaue Werte speichern, ohne den korrekten Jahreswert (die Summe der 12 Monate) zu verlieren.</p>
<p>&#160;</p>
<p>Auch hier führen wieder viele Wege nach Rom, daher zeige ich im ersten Teil neben der eigentlichen Problemstellung und dem Kern der Lösung eine von vier (!) Möglichkeiten die ich gefunden habe um die Aufgabe zu lösen.</p>
<p>&#160;</p>
<p>Zunächst einmal überlege ich mir geeignete Ausdrücke um die oben genannte Anforderung innerhalb eines SSIS-Datenfluss&#8217; umsetzen zu können. Für die Monate 1 bis 11 genügt folgender Ausdruck:</p>
<p>&#160;</p>
<p><font face="Consolas">(DT_NUMERIC,6,2)(Value / 12)</font></p>
<p>&#160;</p>
<p>Der Monat 12 erfordert eine Sonderbehandlung, welche durch folgenden Ausdruck gewährleistet wird:</p>
<p>&#160;</p>
<p><font face="Consolas">(DT_NUMERIC,6,2)(Value &#8211; (DT_NUMERIC,6,2)(11 * (DT_NUMERIC,6,2)(Value / 12)))</font></p>
<p>&#160;</p>
<p>Im Grunde ermittelt dieser Ausdruck die Differenz zwischen dem Jahreswert und der Summe der 11 Monatswerte um den Wert für Monat 12 zu berechnen. Beachten Sie dabei, dass es egal ist ob bei der Ermittlung der Monatswerte ab- oder aufgerundet oder gar abgeschnitten wird (was hier der Fall ist), der Wert für Monat 12 wird stets korrekt ermittelt.</p>
<p>&#160;</p>
<p>Einer der naheliegendsten Wege um diese Logik umzusetzen ist die Nutzung eines Cross Joins zwischen dem Jahreswert und 12 Monaten. Damit wird der Jahreswert von einer Zeile auf 12 Zeilen verteilt. Anschließend kann in einem &#8220;Abgeleitete Spalte&#8221;-Task der Wert mit Hilfe der oben beschriebenen Ausdrücke manipuliert werden.</p>
<p>&#160;</p>
<p>Folgender Screenshot zeigt den Datenfluss und zwei Data Viewer: einen nach dem Cross Join und einem nach dem Anwenden der Ausdrücke. Beachten Sie, dass sich der Wert für Monat 12 von allen anderen unterscheidet um einen korrekten Jahreswert zu gewährleisten.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cc00279c2c81_1174B/image.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cc00279c2c81_1174B/image_thumb.png" width="572" height="291" /></a></p>
<p>&#160;</p>
<p>Im zweiten Teil zeige ich drei (!) weitere Vorgehensweisen, sowie die Ergebnisse eines Performancetests um zu ermitteln, wie sich die unterschiedlichen Wege im produktiven Einsatz bewähren könnten.</p>
<p></br></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/jahreswerte-auf-monate-verlustfrei-verteilen-teil-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MS-DOS lebt – im ForEachLoop-SSIS Container!</title>
		<link>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/ms-dos-lebt-%e2%80%93-im-foreachloop-ssis-container-2/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/ms-dos-lebt-%e2%80%93-im-foreachloop-ssis-container-2/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 21:32:12 +0000</pubDate>
		<dc:creator>Chris Jacob</dc:creator>
				<category><![CDATA[Integration Services 2005]]></category>
		<category><![CDATA[Integration Services 2008]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=91</guid>
		<description><![CDATA[Wer hätte gedacht dass man heutzutage noch über die Vermächtnisse einer 20 Jahre alten Software stolpern kann – und das in den Integration Services!
Aber beginnen wir von vorne: immer wenn die Bearbeitung mehrere gleichartiger Dateien mittels SSIS gefragt ist, kommt früher oder später der ForEach-Loop-Container zum Einsatz. Damit lässt sich z.B. recht komfortabel über Dateien [...]]]></description>
			<content:encoded><![CDATA[<p>Wer hätte gedacht dass man heutzutage noch über die Vermächtnisse einer 20 Jahre alten Software stolpern kann – und das in den Integration Services!</p>
<p>Aber beginnen wir von vorne: immer wenn die Bearbeitung mehrere gleichartiger Dateien mittels SSIS gefragt ist, kommt früher oder später der ForEach-Loop-Container zum Einsatz. Damit lässt sich z.B. recht komfortabel über Dateien mit einer bestimmten Namensstruktur innerhalb eines Ordners iterieren. So könnte ein mögliches Importszenario vorsehen, dass mehrere Exceldateien in einem Ordner ausgelesen werden sollen – den ForEach-Loop-Container könnte man dann wie folgt konfigurieren:</p>
<p><span id="more-91"></span><br />
<br\><br />
Soweit so gut, der Rest des Paketes könnte dann wie folgt aussehen. Innerhalb des Loops wird eine Variable mit dem aktuellen Dateipfad ausgelesen um alle gefundenen Dateien nach Beendigung des Containers in einer MessageBox anzuzeigen:<br />
<br\><br />
<img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/042910_2132_MSDOSlebti2.png" alt="" /><br />
<br\><br />
Ich habe bisher den Inhalt des betroffenen Ordners unterschlagen, hier ist er:<br />
<br\><br />
<img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/042910_2132_MSDOSlebti3.png" alt="" /><br />
<br\><br />
Und siehe da: unser Paket findet zwei Exceldateien – wunderbar! Oder doch nicht? Störend an dieser Stelle könnte die Excel-Datei sein, die im neuen 2007er Format gespeichert wurde. Diese hat die Endung .xlsx! Eigentlich ganz praktisch, denn die beiden Exceltypen unterscheiden sich grundlegend und erfordern ggf. eine differenzierte Behandlung innerhalb der SSIS. Weitere prüfende Blicke in die Konfiguration des ForEach-Loops lassen letztlich nur einen Schluss zu: egal wie man es dreht und wendet, der Ausdruck im &#8220;Files&#8221;-Feld des Editors lässt sich nicht dahingehend ändern dass er nur .xls Dateien erwischt (was man eigentlich erwarten würde) – der Ausdruck verhält sich also wie *.xls*!<br />
<br\><br />
An dieser Stelle wirken die Books Online einmal mehr erhellend und decken auf, dass es sich quasi um erwünschtes Verhalten handelt – der Ausdruck verhält sich nämlich wie beim dir-Befehl in Windows (siehe: <a href="http://msdn.microsoft.com/en-us/library/ms187670.aspx">http://msdn.microsoft.com/en-us/library/ms187670.aspx</a>). Dieser wiederum ist aus Kompatibilitätsgründen so gestrickt, dass er nur drei Zeichen der Dateinamenerweiterung betrachtet – die gute alte 8.3-Dateinamenbeschränkung aus MS-DOS Zeiten schlägt hier also wieder einmal zu!<br />
<br\><br />
Eine Differenzierung nach Dateierweiterung muss also später geschehen, die könnte dann z.B. so aussehen: innerhalb des ForEach-Loop-Containers fügen wir eine Rangfolgeeinschränkung (zu deutsch: einen Pfeil) ein und binden daran eine SSIS-Expression. Diese prüft, ob die letzten drei Buchstaben des ausgelesenen Dateinamens auch tatsächlich x, l und s sind:<br />
<br\><br />
<img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/042910_2132_MSDOSlebti4.png" alt="" /><br />
<br\><br />
<img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/042910_2132_MSDOSlebti5.png" alt="" /><br />
<br\><br />
So modifiziert, verrichtet das Paket ordnungsgemäß seinen Dienst und findet tatsächlich nur eine Excel-Datei:<br />
<br\><br />
<img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/042910_2132_MSDOSlebti6.png" alt="" /><br />
<br\><br />
Da kann man sich natürlich schon fragen ob es sich um ein Bug oder ein Feature handelt, aber genau wegen diesen Ecken und Kanten lieben wir die Integration Services so sehr – man entdeckt eben immer wieder etwas Neues!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/ms-dos-lebt-%e2%80%93-im-foreachloop-ssis-container-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Codeplex Perlen &#8211; heute: Enhanced SSIS Execute Package Task</title>
		<link>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/codeplex-perlen-heute-enhanced-ssis-execute-package-task/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/codeplex-perlen-heute-enhanced-ssis-execute-package-task/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 13:33:26 +0000</pubDate>
		<dc:creator>Chris Jacob</dc:creator>
				<category><![CDATA[Integration Services 2005]]></category>
		<category><![CDATA[Integration Services 2008]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=81</guid>
		<description><![CDATA[Divide et impera – das von Machiavelli vor gut 500 Jahren geprägte Prinzip des Teilen und Herrschens ist heutzutage eine allseits beliebte Technik zur Problemlösung. Auch in den Integration Services finden sich eine Menge Möglichkeiten, um große Aufgaben in kleinere, übersichtliche Schritte zu unterteilen. Beispiele sind unterschiedliche Datenflüsse für unterschiedliche Aufgaben, die Strukturierung mittels Sequenzcontainern [...]]]></description>
			<content:encoded><![CDATA[<p>Divide et impera – das von Machiavelli vor gut 500 Jahren geprägte Prinzip des Teilen und Herrschens ist heutzutage eine allseits beliebte Technik zur Problemlösung. Auch in den Integration Services finden sich eine Menge Möglichkeiten, um große Aufgaben in kleinere, übersichtliche Schritte zu unterteilen. Beispiele sind unterschiedliche Datenflüsse für unterschiedliche Aufgaben, die Strukturierung mittels Sequenzcontainern und nicht zuletzt die Möglichkeit, aus einem SSIS Paket andere SSIS Pakete aufzurufen.</p>
<p><span id="more-81"></span><br />
<br\><br />
Doch mit steigender Komplexität der Pakete (Verbindungsmanager, Paketvariablen) und ausgiebiger Nutzung der Paketkonfiguration gelangt man mit den SSIS-Bordmitteln einmal mehr an die Grenzen des Wartbaren. Die Integration Services bieten von Haus aus die Möglichkeit, andere SSIS Pakete aufzurufen, doch die Übergabe von Variablen und Verbindungsmanagern an das &#8220;Kindpaket&#8221; gestaltet sich sehr aufwändig (viel Expression-Hacking). Die Möglichkeit, Rückgabewerte vom Kindpaket zu empfangen fehlt gar gänzlich.<br />
<br\><br />
In diese Nische stürzt sich ein Codeplex-Projekt, welches ich im Folgenden kurz vorstellen möchte: der &#8220;Enhanced SSIS Execute Package Task&#8221;. Unter <a href="http://ssisexec.codeplex.com/">http://ssisexec.codeplex.com/</a> ist das noch recht unbekannte Projekt zu finden (derzeit für SSIS 2005 und SSIS 2008 R2 – siehe &#8220;Downloads&#8221;). Hilfreich bei der Installation (es wird eine dll und ein schmales readme geliefert) ist folgender Eintrag in den Books Online: <a href="http://msdn.microsoft.com/en-us/library/ms403356.aspx">http://msdn.microsoft.com/en-us/library/ms403356.aspx</a> Hat man die Komponente erfolgreich installiert lässt sie sich über einen Rechtsklick in die Toolbox -&gt; Choose Items in die Liste der Kontrollfluss Tasks aufnehmen.<br />
<br\><br />
<img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/enhanced_1.png" alt="" /><br />
<br\><br />
Die Komponente bietet eine grafische Oberfläche zum Mappen der Variablen bzw. Verbindungsmanagern zwischen den Paketen. Diese können entweder im Dateisystem oder in der MSDB serverseitig gespeichert sein. Somit lassen sich recht schnell und komfortabel Konfigurationen zwischen Paketen übergeben. Wie das aussehen könnte sieht man in folgendem screenshot: Hier wird von einem Steuerpaket, welches den Pfad zu einer Exceldatei via Paketkonfiguration erhält, ein Kindpaket aufgerufen wobei der Verbindungsmanager zwischen den Paketen übergeben wird.<br />
<br\><br />
<img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/enhanced_2.png" alt="" /><br />
<br\><br />
<strong>Hinweis:</strong> Das Projekt hat derzeit noch den <strong>Alpha-Status</strong> – vom Einsatz in einer Produktivumgebung rate ich also dringend ab! Laut Aussage des Authors scheint es aber stabil zu laufen und dieser freut sich mit Sicherheit über ausgiebiges feedback in Form von Kommentaren oder Anmerkungen. In diesem Sinne: happy testing!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/codeplex-perlen-heute-enhanced-ssis-execute-package-task/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excel und führende Nullen vs. SSIS</title>
		<link>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/excel-und-fuhrende-nullen-vs-ssis/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/excel-und-fuhrende-nullen-vs-ssis/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 08:03:47 +0000</pubDate>
		<dc:creator>Chris Jacob</dc:creator>
				<category><![CDATA[Integration Services 2005]]></category>
		<category><![CDATA[Integration Services 2008]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=79</guid>
		<description><![CDATA[Wer kennt sie nicht: die Problematik der führenden Nullen in Excel. Um beispielsweise Postleitzahlen mit führenden Nullen korrekt darzustellen, bedarf es in aller Regel Einiges an Formatierungsaufwand, da Excel Zahlen gerne als numerischen Wert interpretiert. Befüllt man nun mit den SSIS ein Excel-Ziel, gehen führende Nullen beim ersten Öffnen der Excel-Mappe verloren, ganz gleich ob [...]]]></description>
			<content:encoded><![CDATA[<p>Wer kennt sie nicht: die Problematik der führenden Nullen in Excel. Um beispielsweise Postleitzahlen mit führenden Nullen korrekt darzustellen, bedarf es in aller Regel Einiges an Formatierungsaufwand, da Excel Zahlen gerne als numerischen Wert interpretiert. Befüllt man nun mit den SSIS ein Excel-Ziel, gehen führende Nullen beim ersten Öffnen der Excel-Mappe verloren, ganz gleich ob man z.B. eine Spalte PLZ als Text oder Zahl durchleitet.</p>
<p><span id="more-79"></span><br />
<br\><br />
Abhilfe schafft hier ein kleiner Trick, der in den screenshots unten zu sehen ist. Mittels des Tasks &#8220;Abgeleitete Spalte&#8221; erstellt man eine neue Textspalte, deren Inhalt die Spalte mit den führenden Nullen eingebettet in Hochkommata und ein vorangestelltes Gleichheitszeichen ist (Escape-Sequenz beachten!).<br />
<br\><br />
<img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/030110_0803_Excelundfhr1.png" alt="" /><br />
<br\><br />
<img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/030110_0803_Excelundfhr2.png" alt="" /><br />
<br\><br />
Als Resultat interpretiert Excel fortan den Wert in der Spalte als Formel und die führende Null wird korrekt dargestellt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/excel-und-fuhrende-nullen-vs-ssis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Top 4 der „Spaltenumbenennung in SSIS“</title>
		<link>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/die-top-4-der-%e2%80%9espaltenumbenennung-in-ssis%e2%80%9c/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/die-top-4-der-%e2%80%9espaltenumbenennung-in-ssis%e2%80%9c/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 09:19:03 +0000</pubDate>
		<dc:creator>Chris Jacob</dc:creator>
				<category><![CDATA[Integration Services 2005]]></category>
		<category><![CDATA[Integration Services 2008]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[Spaltenumbenennung]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/sql-server-2005/integration-services-2005/die-top-4-der-%e2%80%9espaltenumbenennung-in-ssis%e2%80%9c/</guid>
		<description><![CDATA[Bekanntlich führen bei den Integration Services viele Wege zum Ziel. So kann selbst die Lösung einfachster Aufgaben bei unterschiedlichen Entwicklungsstilen beliebig komplex ausfallen. Heute möchte ich Ihnen meine vier beliebtesten Lösungen für die typische Aufgabe &#8220;Wie benenne ich eine Spalte im SSIS-Datenfluss um?&#8221; vorstellen. Die Aufgabe: zwei Spalten namens &#8220;given_name&#8221; und &#8220;surname&#8221; sollen in &#8220;FirstName&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Bekanntlich führen bei den Integration Services viele Wege zum Ziel. So kann selbst die Lösung einfachster Aufgaben bei unterschiedlichen Entwicklungsstilen beliebig komplex ausfallen. Heute möchte ich Ihnen meine vier beliebtesten Lösungen für die typische Aufgabe &#8220;Wie benenne ich eine Spalte im SSIS-Datenfluss um?&#8221; vorstellen. Die Aufgabe: zwei Spalten namens &#8220;given_name&#8221; und &#8220;surname&#8221; sollen in &#8220;FirstName&#8221; bzw. &#8220;LastName&#8221; umbenannt werden. Die Lösung: Sehen Sie selbst! Und wetten, Sie kennen mindestens einen der Wege noch nicht?</p>
<p><span id="more-72"></span><br />
<br\><br />
<strong>Weg #1: Abgeleitete Spalte</strong><br />
<br\><br />
Der &#8220;Standardweg&#8221; zeichnet sich durch Übersichtlichkeit und Einfachheit aus. Mit dem Toolbox-Element &#8220;Abgeleitete Spalte&#8221; lassen sich bekanntlich neue Spalten erstellen. So können wir ganz bequem zwei neue Spalten mit den gewünschten Namen erstellen, deren Inhalt einfach aus den alten Spalten abgeleitet wird:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/102709_0918_DieTop4der1.png" alt="" /><br />
<br\><br />
Der große Nachteil hierbei ist die Tatsache, dass unser Datenfluss von nun an vier Spalten enthält, wobei wir nur zwei benötigen. Ich halte meine SSIS-Pakete gerne übersichtlich, und spätestens wenn es an das Wegschreiben der Daten geht hilft es, wenn die Spalten in Bezeichnung und Anzahl übereinstimmen. Abhilfe schafft hier das &#8220;Union All&#8221; Element, welches das Löschen überflüssiger Spalten ermöglicht. Hinter dem Union-Element erscheinen dann nur noch die gewünschten Spalten:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/102709_0918_DieTop4der2.png" alt="" /><br />
<br\><br />
<strong>Weg #2: Der Erweiterte Editor</strong><br />
<br\><br />
Bei vielen Toolbox-Elementen lassen sich Ausgangsspalten auch direkt umbenennen, so z.B. bei dem Element &#8220;Suche&#8221;. Für alle gewünschten Suchspalten lässt sich ein Alias definieren:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/102709_0918_DieTop4der3.png" alt="" /><br />
<br\><br />
Manchmal hilft auch der Blick in den &#8220;erweiterten Editor&#8221;, der für viele Toolbox-Elemente dieselbe Funktionalität bietet, nur eben etwas versteckter.<br />
<br\><br />
<strong>Weg #3: Das Union-Element</strong><br />
<br\><br />
&#8220;In der Kürze liegt die Würze&#8221; – so oder so ähnlich könnte das Tooltip für das Union-Element lauten, denn es erlaubt die Umbenennung der Ausgangsspalten nach Belieben:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/102709_0918_DieTop4der4.png" alt="" /><br />
<br\><br />
Aber Vorsicht! Diese Lösung erscheint solange praktikabel bis sich die Metadaten der betroffenen Spalten irgendwo überhalb des Union-Elements ändern. Dann erwartet Sie (je nach Art der Metadatenänderung) eine regelrechte &#8220;Klickorgie&#8221;, da die betroffenen Spalten aus dem Union-Element entfernt, neu eingefügt und umbenannt werden müssen. Das alles natürlich erst nachdem SSIS Sie freundlich mit einem Pop-Up auf die Metadaten-Änderung hingewiesen hat. Im schlimmsten Fall haben Sie beim Troubleshooting vergessen, wie die eigentliche Umbenennung lautete&#8230;<br />
<br\><br />
<strong>Weg #4: Abgeleitete Spalte für Fortgeschrittene</strong><br />
<br\><br />
Einen sehr eigenwilligen Weg habe ich erst kürzlich entdeckt. Bei der Einarbeitung in ein bestehendes SSIS-Paket verfolgte ich den Verlauf einer Spalte, wobei mir auffiel, dass die Spaltenbezeichner vor und nach einem Element &#8220;Abgeleitete Spalte&#8221; komplett unterschiedlich waren und weder ersichtlich wurde an welcher Stelle eine Umbenennung stattgefunden hatte, noch welche Ausgangsspalte den Inhalt welcher Eingangsspalte trug. Nach langem Probieren war ich in der Lage folgenden &#8220;hack&#8221; zu rekonstruieren:<br />
<br\><br />
Zunächst nutzt man das Element &#8220;Abgeleitete Spalte&#8221; um den Inhalt der beiden Spalten mit deren Inhalt zu ersetzen – intuitiv, nicht wahr?</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/102709_0918_DieTop4der5.png" alt="" /><br />
<br\><br />
Anschließend folgt die Umbenennung, indem man in der linken Spalte den gewünschten Bezeichner einträgt und [Enter] drückt. Der screenshot zeigt, dass die erste Spalte (given_name) bereits umbenannt wurde und die zweite Spalte kurz vor der Umbenennung steht.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/102709_0918_DieTop4der6.png" alt="" /><br />
<br\><br />
Von nun an sind die Spalten in diesem Element nur noch unter dem neuen Namen zu finden – keine Spur mehr von den alten Bezeichnern! Dies bezeugen auch die die Metadaten des folgenden Pfades:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/102709_0918_DieTop4der7.png" alt="" /><br />
<br\><br />
Diese &#8220;gespenstische&#8221; Lösung realisiert die Spaltenumbenennung im Verborgenen und ist alles andere als transparent für den Nutzer. Viel schlimmer ist allerdings noch, dass die Zuordnung der Eingangs- zu den Ausgangsspalten überhaupt nicht mehr ersichtlich wird und man damit auf die Semantik der Bezeichner angewiesen ist. Semantik – igitt.<br />
<br\><br />
Im &#8220;daily business&#8221; bevorzuge ich übrigens wann immer es geht Weg #2 und dort wo mir nichts anderes übrig bleibt Weg #1. Ein wichtiges Kriterium beim Entwickeln von ETL-Paketen ist aus meiner Sicht die Lesbarkeit und Verständlichkeit, denn eher früher als später wird sich ein anderer Entwickler oder gar der Kunde mit Ihrem Paket auseinandersetzen müssen/wollen – erst dann zeigt sich wie lesbar Sie entwickelt haben!<br />
<br\><br />
Und? Alles kalter Kaffee für Sie? Oder war doch etwas Neues dabei? Haben Sie noch weitere Lösungen? Wie handhaben Sie die Spaltenumbenennung in Ihrem &#8220;daily business&#8221;? Ich freue mich auf Ihr feedback!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/die-top-4-der-%e2%80%9espaltenumbenennung-in-ssis%e2%80%9c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slowly Changing Dimension – jetzt auch schnell!</title>
		<link>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/slowly-changing-dimension-%e2%80%93-jetzt-auch-schnell/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/slowly-changing-dimension-%e2%80%93-jetzt-auch-schnell/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 14:05:04 +0000</pubDate>
		<dc:creator>Chris Jacob</dc:creator>
				<category><![CDATA[Integration Services 2005]]></category>
		<category><![CDATA[Integration Services 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/sql-server-2005/integration-services/slowly-changing-dimension-%e2%80%93-jetzt-auch-schnell/</guid>
		<description><![CDATA[Wer schon einmal ein bestehendes DWH inkrementell befüllt hat, weiß um die Problematik der langsam veränderlichen Dimension (kurz: SCD). Dabei handelt es sich um meist kleine Veränderungen, die Datensätze einer Dimension betreffen. Dabei lassen sich viele Spezialfälle unterscheiden und in der Regel erfordert der Umgang mit einer SCD viel Fingerspitzengefühl.


Die SQL Server Integration Services bieten [...]]]></description>
			<content:encoded><![CDATA[<p>Wer schon einmal ein bestehendes DWH inkrementell befüllt hat, weiß um die Problematik der langsam veränderlichen Dimension (kurz: SCD). Dabei handelt es sich um meist kleine Veränderungen, die Datensätze einer Dimension betreffen. Dabei lassen sich viele Spezialfälle unterscheiden und in der Regel erfordert der Umgang mit einer SCD viel Fingerspitzengefühl.</p>
<p><span id="more-49"></span><br />
<br\><br />
Die SQL Server Integration Services bieten dem Benutzer daher einen SCD-Wizard, in dem er schnell und unkompliziert die veränderliche Dimension bearbeiten kann. Wer ihn schon einmal benutzt hat, kennt aber die beiden Hauptärgernisse:<br />
<br\><br />
1. Änderungen an der Komponente zerstören schnell die mühsam erstellten Beziehungen zu folgenden Komponenten.<br />
2. Größere Dimensionen werden äußerst unperformant behandelt.<br />
<br\><br />
So wird die SCD Komponente oft von workarounds abgelöst und fristet ihr Schattendasein zwischen Skript-Task und SQL-Befehlen.<br />
<br\><br />
In den vergangenen Monaten wurde auf Microsofts Community-Plattform <a href="http://www.codeplex.com">Codeplex</a> ein Projekt namens <a href="http://kimballscd.codeplex.com">KimballsMethodSCD</a> entwickelt, welches der Slowly Changing Dimension in den SSIS zu neuem Glanz verhelfen soll. Autor der Komponente ist <a href="http://toddmcdermid.blogspot.com">Todd McDermid</a>; als Pate für den Projektnamen stand Ralph Kimball ein, dessen SCD-Best Practices aus seinem Buch The Data Warehouse Toolkit signifikanten Einfluss auf die Entwicklung der Komponente hatten. Aber nun zum Addon: die Installation gestaltet sich dank msi-Installer problemlos; die KimballMethodSCD Komponente ist dann als Datenfluss-Komponente verfügbar. Eine erschöpfende Beschreibung der Fähigkeiten der Komponente würde genügend Stoff für zehn Blog-Einträge liefern, daher seien an dieser Stelle die „Perlen“ erwähnt:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cj/cj_kimballscd_2.jpg" alt="KimballMethodSCD" /><br />
<br\><br />
- Umsetzung der Best Practices nach Kimball: unknown member Unterstützung; Angabe eines Änderungsgrundes als Spalte für geänderte Spalten; einfaches Row Auditing für Einfüge- und Updateoperationen<br />
- die existierende Dimension wird aus einem Datenfluss heraus gelesen statt aus einem Connection Manager; dies ermöglicht mehr Flexibilität und besseres Cacheverhalten<br />
- Änderungen wirken sich nicht zerstörerisch auf darunterliegende Komponenten aus<br />
- flexible Spaltenvergleiche sind möglich: z.B. können Spalten Case-(un)sensitiv und Space (un)sensitiv verglichen werden<br />
- eine Performancesteigerung gegenüber der Standard Komponente um den Faktor 100 (!) kann bei großen Dimensionen ohne weiteres erreicht werden</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cj/cj_kimballscd_3.jpg" alt="KimballMethodSCD" /><br />
<br\><br />
Während die ersten Punkte im Wesentlichen Designhilfen für den Entwickler darstellen, ist die Performancesteigerung ein netter Nebeneffekt der guten Implementierung des Addons: durch die Nutzung multipler Threads und einer Sortieroptimierung sind Ausführungszeiten möglich, die mit dem Standard Wizard undenkbar sind. Dieser nutzt einen langsamen Row-by-Row Lookup auf die Dimensionstabelle, während der KimballlMethod SCD die gesamte Tabelle in einem Stream einliest.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cj/cj_kimballscd_1.jpg" alt="KimballMethodSCD" /><br />
<br\><br />
Obiges Beispiel, welches neben dem Addon auch als SSIS-Solution zum Download angeboten wird, zeigt den imposanten Performancegewinn: Eine Dimensionstabelle wurde mit 120.000 Datensätzen geladen. Anschließend wurden die Quelldatensätze dahingehend manipuliert, dass 33 SCD1 Änderungen und 42 SCD2 Änderungen entstanden, wodurch ein winziger Bruchteil der Dimensionsdatensätze geändert werden mussten. Bei den Ausführungszeiten zeigte sich, dass der SSIS Standard Wizard 29 Minuten brauchte, der KimballMethod SCD hingegen nur <strong>15 Sekunden (!)</strong>. Zwar musste das ausführende System einen 10fach gestiegenen Hauptspeicherbedarf kompensieren, der Anwender wurde aber mit einer <strong>118fachen</strong> Leistungssteigerung belohnt.<br />
<br\><br />
Die Ausführungszeiten, die nach Ralph Kimballs Best Practices erweiterte Funktionalität und letztlich auch die Einfachheit der KimballMethod SCD machen diese zu einer echten Alternative zum Standard Wizard und verhelfen der etwas eingestaubten Slowly Changing Dimension in den SSIS zu neuem Glanz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/slowly-changing-dimension-%e2%80%93-jetzt-auch-schnell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parametrisierte DataReader Quelle in SSIS</title>
		<link>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/parametrisierte-datareader-quelle-in-ssis/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/parametrisierte-datareader-quelle-in-ssis/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 10:47:45 +0000</pubDate>
		<dc:creator>Chris Jacob</dc:creator>
				<category><![CDATA[Integration Services 2005]]></category>
		<category><![CDATA[Integration Services 2008]]></category>
		<category><![CDATA[DataReader]]></category>
		<category><![CDATA[SSIS]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/sql-server-2005/integration-services/parametrisierte-datareader-quelle-in-ssis/</guid>
		<description><![CDATA[Bei der Integration verschiedenster Quellen mit Hilfe der Integration Services des SQL Server 2005/2008 kommt es durchaus vor, dass man es mit ODBC-Quellen zu tun hat, die man nur mit Hilfe einer DataReader-Verbindung auslesen kann. Möchte man seine Abfragen an die Quelle parametrisieren, stößt man allerdings schnell an die Grenzen des DataReaders: während Anfragen an [...]]]></description>
			<content:encoded><![CDATA[<p>Bei der Integration verschiedenster Quellen mit Hilfe der Integration Services des SQL Server 2005/2008 kommt es durchaus vor, dass man es mit ODBC-Quellen zu tun hat, die man nur mit Hilfe einer DataReader-Verbindung auslesen kann. Möchte man seine Abfragen an die Quelle parametrisieren, stößt man allerdings schnell an die Grenzen des DataReaders: während Anfragen an OLE DB-Quellen ohne weiteres parametrisiert werden können, gibt es hier keinen offensichtlichen Weg.<br />
<span id="more-47"></span><br />
<br\><br />
Folgendes Beispiel illustriert das Problem: die Einschränkung auf das SellStartYear soll hier über einen externen Parameter gesteuert werden.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cj/cj_datareader_1.jpg" alt="DataReader" /><br />
<br\><br />
Der Editor bietet weder die direkte Parametrisierung der Anfrage, noch eine indirekte durch Übergabe eines Strings als SQL-Kommando.<br />
Abhilfe schafft hier nur folgender Trick:<br />
Der Datenfluss, in dem die Quelle enthalten ist bietet in seinen Eigenschaften die Konfiguration verschiedener Werte über Expressions.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cj/cj_datareader_2.jpg" alt="DataReader" /><br />
 <br\><br />
Hier lassen sich unter anderem die SQL-Kommandos aller enthaltenen Quellen über Expressions steuern. In unserem Beispiel wäre das die Eigenschaft [Data Reader Source].[SQLCommand]. Zu beachten ist hierbei nur, dass die Name-Eigenschaft der Quelle (in diesem Fall „Data Reader Source“) statisch sein muss. Nun kann man die SQL-Abfrage über den Expression-Editor beliebig parametrisieren.<br />
 <br />
<img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cj/cj_datareader_3.jpg" alt="DataReader" /><br />
<br\><br />
In unserem Fall haben wir das Jahr in eine String-Variable ausgelagert, die wir beliebig dynamisch halten können.<br />
Damit man nicht den Überblick verliert, bietet sich die Expression Highlight Funktion des BIDS-Helper an. Dieser markiert den Datenfluss nach erfolgreicher Konfiguration mit einem magentafarbenen Dreieck. So sieht man sofort, hinter welchen SSIS-Objekten sich Expressions verbergen.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cj/cj_datareader_4.jpg" alt="DataReader" /><br />
 <br\><br />
Derselbe workaround funkioniert auch für die ADO.NET-Quellen in den Integration Services des SQL Server 2008. Hier wurde zwar der Editor optisch auf das Level der OLE DB-Quellen gebracht, an der fehlenden Funktionalität bezüglich der Parametrisierung hat sich aber leider nichts geändert.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/parametrisierte-datareader-quelle-in-ssis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

