<?xml version="1.0" encoding="utf-8"?><!-- generator="b2evolution/6.11.7-stable" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Sascha Lorenz - Kategorie: "Einsteiger"</title>
		<link>https://www.insidesql.org/blogs/saschalorenz/</link>
		<atom:link rel="self" type="application/rss+xml" href="https://www.insidesql.org/blogs/saschalorenz/?tempskin=_rss2" />
		<description>InsideSQL.org Blogs - Blogs über SQL Server</description>
		<language>de-DE</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=6.11.7-stable"/>
		<ttl>60</ttl>
				<item>
			<title>Mehr zu MERGE in T-SQL - Der Cursor Alternative!</title>
			<link>https://www.insidesql.org/blogs/saschalorenz/2011/06/17/mehr-zu-merge-in-t</link>
			<pubDate>Fri, 17 Jun 2011 12:28:00 +0000</pubDate>			<dc:creator>Sascha Lorenz</dc:creator>
			<category domain="main">SQL Server</category>
<category domain="alt">Einsteiger</category>
<category domain="alt">Business Intelligence</category>			<guid isPermaLink="false">2952@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;Zu meinem Post über den &lt;a href=&quot;http://saschalorenz.blogspot.com/2011/06/merge-in-t-sql-der-unbekannte-befehl-im.html&quot;&gt;MERGE Befehl des SQL Servers&lt;/a&gt; habe ich viel Feedback bekommen und das Interesse an mehr dazu scheint recht groß. Danke dafür!&lt;/p&gt;  &lt;p&gt;Und tatsächlich ist der MERGE Befehl auch noch um einiges mächtiger als ich in dem Beispiel für einen einfachen ELT Ladeprozess gezeigt hatte. Und natürlich lässt sich damit mehr machen als nur einen ELT Prozess zu unterstützen.&lt;/p&gt;  &lt;p&gt;Hier noch mal die grundlegende Syntax:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MERGE&lt;/strong&gt; &amp;lt;Ziel&amp;gt;     &lt;br /&gt;&lt;strong&gt;USING&lt;/strong&gt; &amp;lt;Quelle&amp;gt;     &lt;br /&gt;&lt;strong&gt;ON&lt;/strong&gt; &amp;lt;Bedingung&amp;gt;     &lt;br /&gt;&lt;strong&gt;WHEN &lt;em&gt;MATCHED&lt;/em&gt; THEN&lt;/strong&gt; &amp;lt;Update oder Delete&amp;gt;     &lt;br /&gt;&lt;strong&gt;WHEN &lt;em&gt;NOT MATCHED&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;THEN&lt;/strong&gt; &amp;lt;meist ein Insert&amp;gt;;&lt;/p&gt;  &lt;p&gt;Nun, was geht jetzt noch? :-)&lt;/p&gt;  &lt;p&gt;Eine interessante Möglichkeit ist, dass sowohl zwei &lt;strong&gt;&lt;em&gt;MATCHED&lt;/em&gt;&lt;/strong&gt; als auch mehrere &lt;em&gt;&lt;strong&gt;NOT MATCHED&lt;/strong&gt;&lt;/em&gt; Klauseln unterstützt werden. Für den Einsatz gibt es aber Bedingungen.&lt;/p&gt;  &lt;p&gt;Wenn mit zwei &lt;strong&gt;&lt;em&gt;MATCHED&lt;/em&gt;&lt;/strong&gt; Klauseln gearbeitet werden soll, dann muss die erste Klausel auf jeden Fall eine erweiterte Bedingung mittels &lt;strong&gt;&lt;em&gt;AND&lt;/em&gt;&lt;/strong&gt; Klausel beinhalten. Des Weiteren kann nur einmal &lt;strong&gt;&lt;em&gt;UPDATE&lt;/em&gt;&lt;/strong&gt; und einmal &lt;strong&gt;&lt;em&gt;DELETE&lt;/em&gt;&lt;/strong&gt; genutzt werden! Also ein &quot;wenn Du so, dann Update A und wenn Du so, dann Update B&quot; geht nicht. Dafür muss dann die OUTPUT Klausel verwendet werden, um den Befehl mit einem weiteren zu verbinden.&lt;/p&gt;  &lt;p&gt;Ein möglicher Anwendungsfall für zwei &lt;strong&gt;&lt;em&gt;MATCHED&lt;/em&gt;&lt;/strong&gt; ist zum Beispiel wenn ein Kennzeichen in der Quelle für das Löschen eines Datensatzes im Ziel mit übergeben wird. &lt;/p&gt;  &lt;p&gt;Wie ist das mit der &lt;strong&gt;&lt;em&gt;NOT MATCHED&lt;/em&gt;&lt;/strong&gt; Klausel? Erst mal der Hinweis, dass T-SQL standardmäßig davon ausgeht, dass wir meinen, dass ein Satz aus der Quelle nicht im Ziel gefunden wird. Logisch, oder? Aber es gibt durchaus auch die Version &lt;strong&gt;&lt;em&gt;WHEN NOT MATCHED BY SOURCE&lt;/em&gt;&lt;/strong&gt;. Damit werden Aktionen ausgelöst, wenn ein Satz aus dem Ziel nicht &quot;mehr&quot; in der Quelle gefunden wurde. Für alle Mengenlehre Fans unter Euch, dass ist dann ein Right outer join. Überhaupt ist der MERGE Befehl weniger eine Mischung aus UPDATE, INSERT und DELETE als eher ein JOIN mit der Option auf Aktionen. Und &lt;strong&gt;&lt;em&gt;WHEN NOT MATCHED BY SOURCE&lt;/em&gt;&lt;/strong&gt; darf wiederum zweimal vorkommen und als Aktionen entweder ein UPDATE oder DELETE auslösen. Also ähnlich einem &lt;em&gt;&lt;strong&gt;MATCHED&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;So, und nun nicht die &lt;strong&gt;&lt;em&gt;OUTPUT&lt;/em&gt;&lt;/strong&gt; Klausel vergessen. Und nochmals der Hinweis, die gibt es auch für INSERT, DELETE und UPDATE !!!&lt;/p&gt;  &lt;p&gt;Zwischenstand, was haben wir denn bisher:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MERGE&lt;/strong&gt; &amp;lt;Ziel&amp;gt;     &lt;br /&gt;&lt;strong&gt;USING&lt;/strong&gt; &amp;lt;Quelle&amp;gt;     &lt;br /&gt;&lt;strong&gt;ON&lt;/strong&gt; &amp;lt;Bedingung&amp;gt;     &lt;br /&gt;&lt;strong&gt;WHEN &lt;em&gt;MATCHED&lt;/em&gt; (AND .) THEN&lt;/strong&gt; &amp;lt;Update oder Delete&amp;gt;     &lt;br /&gt;&lt;strong&gt;WHEN &lt;em&gt;MATCHED&lt;/em&gt; (AND .) THEN&lt;/strong&gt; &amp;lt;Update oder Delete&amp;gt;     &lt;br /&gt;&lt;strong&gt;WHEN &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;NOT&lt;/strong&gt; &lt;strong&gt;MATCHED&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt; (BY TARGET (AND))&lt;/strong&gt; &lt;strong&gt;THEN&lt;/strong&gt; &amp;lt;Insert&amp;gt;     &lt;br /&gt;&lt;strong&gt;WHEN &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;NOT&lt;/strong&gt; &lt;strong&gt;MATCHED&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt; (BY SOURCE (AND))&lt;/strong&gt; &lt;strong&gt;THEN&lt;/strong&gt; &amp;lt;Update oder Delete&amp;gt;     &lt;br /&gt;&lt;strong&gt;WHEN &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;NOT&lt;/strong&gt; &lt;strong&gt;MATCHED&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt; (BY SOURCE (AND))&lt;/strong&gt; &lt;strong&gt;THEN&lt;/strong&gt; &amp;lt;Update oder Delete&amp;gt;     &lt;br /&gt;&lt;strong&gt;OUTPUT $ACTION (,.)&lt;/strong&gt;;&lt;/p&gt;  &lt;p&gt;Des Weiteren ist wichtig zu verstehen, dass jede Zeile nur einmal evaluiert wird! Also eine &lt;strong&gt;ON&lt;/strong&gt; Bedingung, welche eine 1:N Verknüpfung enthält, wird fehlschlagen, wenn diese nicht durch eine weitere Bedingung &quot;ausgebremst&quot; wird. Der SQL Server wirft sonst folgende Fehlermeldung:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&quot;Die MERGE-Anweisung hat versucht, dieselbe Zeile mehr als einmal zu aktualisieren oder zu löschen. Dies passiert, wenn eine Zielzeile mehr als einer Quellzeile entspricht. Eine MERGE-Anweisung kann dieselbe Zeile der Zieltabelle nicht mehrfach aktualisieren/löschen. Optimieren Sie die ON-Klausel, um sicherzustellen, dass eine Zielzeile mindestens einer Quellzeile entspricht, oder verwenden Sie die GROUP BY-Klausel, um die Quellzeilen zu gruppieren.&quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Was kann nun alles damit realisiert werden? &lt;/p&gt;  &lt;p&gt;Gerade &lt;strong&gt;WHEN &lt;/strong&gt;&lt;em&gt;&lt;strong&gt;NOT&lt;/strong&gt; &lt;strong&gt;MATCHED&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt; (BY SOURCE (AND))&lt;/strong&gt; &lt;strong&gt;THEN&lt;/strong&gt; ermöglicht schöne Sachen. Zum Beispiel eine Historisierung von Daten, wenn diese im Quellsystem nicht mehr vorhanden sind. Also wenn Satz im Ziel vorhanden ist, aber in der Quelle nicht mehr, dann können wir diesen Löschen (wie öde) oder mittels UPDATE ein inaktiv Kennzeichen setzen. Dieses inaktiv Kennzeichen sollte dann aber auch als zusätzliche Bedingung aufgenommen werden, weil wir ja sonst immer dieses UPDATE durchführen würde, was recht suboptimal wäre.&lt;/p&gt;  &lt;p&gt;So, und zum Abschluss noch der Hinweis an Alle, dass ich MERGE häufig als Alternative oder auch als deutliche Optimierung zum klassischen Cursor verwende! Viele Logiken, welche auf der Basis einer zeilenweise Betrachtungsweise von Tabellen basieren, lassen sich mittels &lt;strong&gt;&lt;em&gt;MERGE&lt;/em&gt;&lt;/strong&gt; bzw. auch einem zusammengesetzten Statement mit der Verwendung von OUTPUT, wesentlich effizienter gestalten!&lt;/p&gt;</description>
			<content:encoded><![CDATA[<p>Zu meinem Post über den <a href="http://saschalorenz.blogspot.com/2011/06/merge-in-t-sql-der-unbekannte-befehl-im.html">MERGE Befehl des SQL Servers</a> habe ich viel Feedback bekommen und das Interesse an mehr dazu scheint recht groß. Danke dafür!</p>  <p>Und tatsächlich ist der MERGE Befehl auch noch um einiges mächtiger als ich in dem Beispiel für einen einfachen ELT Ladeprozess gezeigt hatte. Und natürlich lässt sich damit mehr machen als nur einen ELT Prozess zu unterstützen.</p>  <p>Hier noch mal die grundlegende Syntax:</p>  <p><strong>MERGE</strong> &lt;Ziel&gt;     <br /><strong>USING</strong> &lt;Quelle&gt;     <br /><strong>ON</strong> &lt;Bedingung&gt;     <br /><strong>WHEN <em>MATCHED</em> THEN</strong> &lt;Update oder Delete&gt;     <br /><strong>WHEN <em>NOT MATCHED</em></strong> <strong>THEN</strong> &lt;meist ein Insert&gt;;</p>  <p>Nun, was geht jetzt noch? :-)</p>  <p>Eine interessante Möglichkeit ist, dass sowohl zwei <strong><em>MATCHED</em></strong> als auch mehrere <em><strong>NOT MATCHED</strong></em> Klauseln unterstützt werden. Für den Einsatz gibt es aber Bedingungen.</p>  <p>Wenn mit zwei <strong><em>MATCHED</em></strong> Klauseln gearbeitet werden soll, dann muss die erste Klausel auf jeden Fall eine erweiterte Bedingung mittels <strong><em>AND</em></strong> Klausel beinhalten. Des Weiteren kann nur einmal <strong><em>UPDATE</em></strong> und einmal <strong><em>DELETE</em></strong> genutzt werden! Also ein "wenn Du so, dann Update A und wenn Du so, dann Update B" geht nicht. Dafür muss dann die OUTPUT Klausel verwendet werden, um den Befehl mit einem weiteren zu verbinden.</p>  <p>Ein möglicher Anwendungsfall für zwei <strong><em>MATCHED</em></strong> ist zum Beispiel wenn ein Kennzeichen in der Quelle für das Löschen eines Datensatzes im Ziel mit übergeben wird. </p>  <p>Wie ist das mit der <strong><em>NOT MATCHED</em></strong> Klausel? Erst mal der Hinweis, dass T-SQL standardmäßig davon ausgeht, dass wir meinen, dass ein Satz aus der Quelle nicht im Ziel gefunden wird. Logisch, oder? Aber es gibt durchaus auch die Version <strong><em>WHEN NOT MATCHED BY SOURCE</em></strong>. Damit werden Aktionen ausgelöst, wenn ein Satz aus dem Ziel nicht "mehr" in der Quelle gefunden wurde. Für alle Mengenlehre Fans unter Euch, dass ist dann ein Right outer join. Überhaupt ist der MERGE Befehl weniger eine Mischung aus UPDATE, INSERT und DELETE als eher ein JOIN mit der Option auf Aktionen. Und <strong><em>WHEN NOT MATCHED BY SOURCE</em></strong> darf wiederum zweimal vorkommen und als Aktionen entweder ein UPDATE oder DELETE auslösen. Also ähnlich einem <em><strong>MATCHED</strong></em>.</p>  <p>So, und nun nicht die <strong><em>OUTPUT</em></strong> Klausel vergessen. Und nochmals der Hinweis, die gibt es auch für INSERT, DELETE und UPDATE !!!</p>  <p>Zwischenstand, was haben wir denn bisher:</p>  <p><strong>MERGE</strong> &lt;Ziel&gt;     <br /><strong>USING</strong> &lt;Quelle&gt;     <br /><strong>ON</strong> &lt;Bedingung&gt;     <br /><strong>WHEN <em>MATCHED</em> (AND .) THEN</strong> &lt;Update oder Delete&gt;     <br /><strong>WHEN <em>MATCHED</em> (AND .) THEN</strong> &lt;Update oder Delete&gt;     <br /><strong>WHEN </strong><em><strong>NOT</strong> <strong>MATCHED</strong></em><strong> (BY TARGET (AND))</strong> <strong>THEN</strong> &lt;Insert&gt;     <br /><strong>WHEN </strong><em><strong>NOT</strong> <strong>MATCHED</strong></em><strong> (BY SOURCE (AND))</strong> <strong>THEN</strong> &lt;Update oder Delete&gt;     <br /><strong>WHEN </strong><em><strong>NOT</strong> <strong>MATCHED</strong></em><strong> (BY SOURCE (AND))</strong> <strong>THEN</strong> &lt;Update oder Delete&gt;     <br /><strong>OUTPUT $ACTION (,.)</strong>;</p>  <p>Des Weiteren ist wichtig zu verstehen, dass jede Zeile nur einmal evaluiert wird! Also eine <strong>ON</strong> Bedingung, welche eine 1:N Verknüpfung enthält, wird fehlschlagen, wenn diese nicht durch eine weitere Bedingung "ausgebremst" wird. Der SQL Server wirft sonst folgende Fehlermeldung:</p>  <p><em>"Die MERGE-Anweisung hat versucht, dieselbe Zeile mehr als einmal zu aktualisieren oder zu löschen. Dies passiert, wenn eine Zielzeile mehr als einer Quellzeile entspricht. Eine MERGE-Anweisung kann dieselbe Zeile der Zieltabelle nicht mehrfach aktualisieren/löschen. Optimieren Sie die ON-Klausel, um sicherzustellen, dass eine Zielzeile mindestens einer Quellzeile entspricht, oder verwenden Sie die GROUP BY-Klausel, um die Quellzeilen zu gruppieren."</em></p>  <p>Was kann nun alles damit realisiert werden? </p>  <p>Gerade <strong>WHEN </strong><em><strong>NOT</strong> <strong>MATCHED</strong></em><strong> (BY SOURCE (AND))</strong> <strong>THEN</strong> ermöglicht schöne Sachen. Zum Beispiel eine Historisierung von Daten, wenn diese im Quellsystem nicht mehr vorhanden sind. Also wenn Satz im Ziel vorhanden ist, aber in der Quelle nicht mehr, dann können wir diesen Löschen (wie öde) oder mittels UPDATE ein inaktiv Kennzeichen setzen. Dieses inaktiv Kennzeichen sollte dann aber auch als zusätzliche Bedingung aufgenommen werden, weil wir ja sonst immer dieses UPDATE durchführen würde, was recht suboptimal wäre.</p>  <p>So, und zum Abschluss noch der Hinweis an Alle, dass ich MERGE häufig als Alternative oder auch als deutliche Optimierung zum klassischen Cursor verwende! Viele Logiken, welche auf der Basis einer zeilenweise Betrachtungsweise von Tabellen basieren, lassen sich mittels <strong><em>MERGE</em></strong> bzw. auch einem zusammengesetzten Statement mit der Verwendung von OUTPUT, wesentlich effizienter gestalten!</p>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/saschalorenz/2011/06/17/mehr-zu-merge-in-t#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/saschalorenz/?tempskin=_rss2&#38;disp=comments&#38;p=2952</wfw:commentRss>
		</item>
				<item>
			<title>Community Webcast Reihe: Das kleine SQL Server 1x1 f&#252;r Software Entwickler auf Channel 9</title>
			<link>https://www.insidesql.org/blogs/saschalorenz/2011/06/09/community-webcast-reihe-das-kleine</link>
			<pubDate>Thu, 09 Jun 2011 07:49:00 +0000</pubDate>			<dc:creator>Sascha Lorenz</dc:creator>
			<category domain="main">Allgemein</category>
<category domain="alt">SQL Server</category>
<category domain="alt">Einsteiger</category>			<guid isPermaLink="false">2946@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;Gestern ist auf &lt;a href=&quot;http://channel9.msdn.com/Blogs/Lori/Einfhrung--bersicht-ber-den-SQL-Server&quot;&gt;Channel 9 der erste Teil einer kleinen Community Webcast Reihe vom Peter Kirchner und mir zum Thema SQL Server speziell für ISVs&lt;/a&gt; online gegangen. Die weiteren Teile werden dann ebenfalls in den nächsten Wochen online gehen. Was machen wir in diesen Casts? Hier der &quot;Klappentext&quot;:&lt;/p&gt;  &lt;p&gt;&quot;&lt;em&gt;In diesem ersten Teil der Webcast-Reihe von Sascha Lorenz und Peter Kirchner zum SQL Server 2008 R2 erhalten Sie einen kurzen Überblick über die Inhalte dieser Webcast-Reihe sowie als Einstieg in das Thema einige Grundlagen, die jeder besitzen sollte, wer mit dem SQL Server arbeitet. Bereits diese Grundlagen können gängige Fehler in Implementierungen, die den SQL Server betreffen, vermeiden und sogar bereits positive Auswirkungen auf die Performance Ihrer Softwarelösungen haben. Insbesondere das Verständnis für Abfragen soll geschärft werden, beim SQL Server in Mengen anstatt in Datensätzen zu denken. Gerade dieses Thema dürfte für Entwickler, die mit Oracle vertraut sind und nun für den Microsoft SQL Server entwickeln, von besonderem Interesse sein.&quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.sascha-lorenz.de/blog/CommunityWebcastReiheDaskleineSQLServer1_87B2/image.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.sascha-lorenz.de/blog/CommunityWebcastReiheDaskleineSQLServer1_87B2/image_thumb.png&quot; width=&quot;341&quot; height=&quot;192&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vielen Dank an Lori und Peter für Ihre Unterstützung für dieses kleine Community Projekt! &lt;/p&gt;</description>
			<content:encoded><![CDATA[<p>Gestern ist auf <a href="http://channel9.msdn.com/Blogs/Lori/Einfhrung--bersicht-ber-den-SQL-Server">Channel 9 der erste Teil einer kleinen Community Webcast Reihe vom Peter Kirchner und mir zum Thema SQL Server speziell für ISVs</a> online gegangen. Die weiteren Teile werden dann ebenfalls in den nächsten Wochen online gehen. Was machen wir in diesen Casts? Hier der "Klappentext":</p>  <p>"<em>In diesem ersten Teil der Webcast-Reihe von Sascha Lorenz und Peter Kirchner zum SQL Server 2008 R2 erhalten Sie einen kurzen Überblick über die Inhalte dieser Webcast-Reihe sowie als Einstieg in das Thema einige Grundlagen, die jeder besitzen sollte, wer mit dem SQL Server arbeitet. Bereits diese Grundlagen können gängige Fehler in Implementierungen, die den SQL Server betreffen, vermeiden und sogar bereits positive Auswirkungen auf die Performance Ihrer Softwarelösungen haben. Insbesondere das Verständnis für Abfragen soll geschärft werden, beim SQL Server in Mengen anstatt in Datensätzen zu denken. Gerade dieses Thema dürfte für Entwickler, die mit Oracle vertraut sind und nun für den Microsoft SQL Server entwickeln, von besonderem Interesse sein."</em></p>  <p><a href="http://www.sascha-lorenz.de/blog/CommunityWebcastReiheDaskleineSQLServer1_87B2/image.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.sascha-lorenz.de/blog/CommunityWebcastReiheDaskleineSQLServer1_87B2/image_thumb.png" width="341" height="192" /></a> </p>  <p>Vielen Dank an Lori und Peter für Ihre Unterstützung für dieses kleine Community Projekt! </p>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/saschalorenz/2011/06/09/community-webcast-reihe-das-kleine#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/saschalorenz/?tempskin=_rss2&#38;disp=comments&#38;p=2946</wfw:commentRss>
		</item>
				<item>
			<title>SSIS (Integration Services) als ETL L&#246;sung &#8211; Dynamisches SSIS? [Coaches&#8217; Hell]</title>
			<link>https://www.insidesql.org/blogs/saschalorenz/2011/05/07/ssis-integration-services-als-etl-3</link>
			<pubDate>Sat, 07 May 2011 10:21:00 +0000</pubDate>			<dc:creator>Sascha Lorenz</dc:creator>
			<category domain="main">PASS Deutschland e.V.</category>
<category domain="alt">SQL Server</category>
<category domain="alt">Einsteiger</category>
<category domain="alt">Business Intelligence</category>			<guid isPermaLink="false">2893@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;Eine häufige Frage an mich ist, warum ich überhaupt so viel Zeit investiere in die Entwicklung von &lt;a href=&quot;http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl_27.html&quot; target=&quot;_blank&quot;&gt;projektspezifischen SSIS Generatoren&lt;/a&gt;. Schließlich lasse sich doch in SSIS fast alles über Expressions und den Mechanismus der Paket-Konfiguration von außen dynamisch steuern! Wozu also der ganze Aufwand?&lt;/p&gt;  &lt;p&gt;Die Aussage mit den Expressions (Ausdrücken) und der Konfiguration ist für sich genommen natürlich korrekt und wird von mir bzw. meinen Kollegen in Projekten auch verwendet. &lt;/p&gt;  &lt;p&gt;Wichtig ist aber die Einsicht, dass sich halt nur &quot;fast&quot; alles damit steuern lässt! Und aufgrund der Architektur der Integration Services lässt sich während der Laufzeit eines Paketes der Inhalt eines Datenflusstasks nicht verändern! Und gerade da setze ich häufig an, um die Erstellung und Wartung von SSIS Paketen weitestgehend zu automatisieren.&lt;/p&gt;  &lt;p&gt;Oft sehe ich aber Ansätze von Kunden oder in der Community für dynamisches SSIS, welche so nicht funktionieren können. Um solchen Missverständnissen vorzubeugen, möchte ich heute mal ein Beispiel zeigen, was eben gerade &lt;strong&gt;nicht funktionieren kann&lt;/strong&gt;. Den Ansatz brachte neulich ein Kunde zum SSIS Coaching mit.&lt;/p&gt;  &lt;p&gt;Also, sein Ansatz sieht vor, dass er zwei Variablen hat. Eine für den Namen einer Tabelle und einen für die SQL Query.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb.png&quot; width=&quot;424&quot; height=&quot;123&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Dann kommt er mit der Idee, die Eigenschaft &quot;EvaluateAsExpression&quot; der Variable &quot;SQL&quot; zu nutzen, um die Query zusammenzusetzen. Damit hat die Variable den Value, welcher sich aus der Expression ergibt. &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_3.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_3.png&quot; width=&quot;369&quot; height=&quot;357&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nun kommt in einem Datenflusstask eine OLE DB Quelle, in welcher die Variable &quot;SQL&quot; verwendet wird. Alles gut, wir sehen die Query unten. Das scheint zu passen.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_4.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_4.png&quot; width=&quot;546&quot; height=&quot;532&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Den Datenfluss erweitern wir nun um einen Multicast, damit er lauffähig wird. Multicast kann ja durchaus aus mal zum Testen von Paketen verwendet werden da es &quot;auch&quot; ein NULL-Ziel sein kann. Noch ein Blick auf die Metadaten, die sind ja das A&amp;amp;O eines Datenflusstasks. Sind auch da. Immer noch alles gut!&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_5.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_5.png&quot; width=&quot;642&quot; height=&quot;280&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Und wir lassen das Paket mal laufen. Wenige Sekunden später. Es funktioniert. Also, wozu die ganze Aufregung?&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_6.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_6.png&quot; width=&quot;317&quot; height=&quot;293&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Kommen wir zum eigentlichen Zweck der Variablen. Ändern wir die Variable für die Tabelle ab, um eine andere Tabelle als Quelle zu verwenden. Ich habe hier gerade noch die Demotabelle für meinen &lt;a href=&quot;http://saschalorenz.blogspot.com/2011/04/integration-services-reporting-services.html&quot; target=&quot;_blank&quot;&gt;RDLInput&lt;/a&gt; liegen, nehmen wir einfach die.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_7.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_7.png&quot; width=&quot;528&quot; height=&quot;142&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Und wieder starte ich das Paket. Und was passiert? Ein Fehler kommt hoch! Hier ist nämlich der Denkfehler versteckt. Und zwar gibt es ein Problem mit den Metadaten.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_8.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_8.png&quot; width=&quot;502&quot; height=&quot;216&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Schließen wir die Meldung und öffnen mal unsere Quelle. Und wieder kommt eine Meldung hoch. Und zwar möchte uns die Quelle mitteilen, dass die SQL Query (in der Variable) und die Metadaten der Quelle nicht mehr synchron sind. Also nicht mehr übereinstimmen. Klar, wir wollten nun ja auch eine andere Tabelle haben und natürlich hat diese andere Spalten. Selbst das automatische Beheben des Fehlers würde nur die Quelle &quot;heilen&quot;, aber die weiteren Datenflusselemente hätten ebenfalls mit den Metadaten zu kämpfen. Also stände uns viel manuelles Doing bevor, um das alles wieder anzupassen. Die dynamische Konfiguration hat sich also nicht gelohnt.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_9.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_9.png&quot; width=&quot;648&quot; height=&quot;283&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Wie kommt es nun dazu? &lt;/p&gt;  &lt;p&gt;Die Architektur der Integration Services sieht vor, dass die Metadaten eines Datenflusstasks zur Entwurfszeit bekannt sind, damit alle der Quelle folgenden Elemente korrekte Input &amp;amp; Output Spalten haben können. Wenn also während der Laufzeit in die Metadaten eingegriffen wird, wie zum Beispiel durch das Neusetzen einer Variable, welche eine Query enthält, dann schützen sich die SSIS und werfen sofort einen Fehler! Wenn Pakete mit den Microsoft Bibliotheken per Repository erzeugt werden, dann befindet sich das Paket in dem Moment ebenfalls im Entwurfsmodus und es können die Metadaten korrekt zugewiesen werden. Das ist die Magie eine SSIS Paket Generators gegenüber der Konfiguration.&lt;/p&gt;  &lt;p&gt;Wo dieser Ansatz aber sehr wohl funktioniert, ist eine Umgebung, in der zwar der Tabellenname sich ändern kann, aber die Metadaten (Spalten) identisch bleiben. Selten, kann es aber auch geben. Häufiger kommt eigentlich vor, dass der Connectionstring einer Quelle und eines Ziels mittels Konfiguration geändert wird, damit man zwischen Entwicklungs-, Test- und Produktivumgebung wechseln kann. Das macht durchaus Sinn! :-)&lt;/p&gt;</description>
			<content:encoded><![CDATA[<p>Eine häufige Frage an mich ist, warum ich überhaupt so viel Zeit investiere in die Entwicklung von <a href="http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl_27.html" target="_blank">projektspezifischen SSIS Generatoren</a>. Schließlich lasse sich doch in SSIS fast alles über Expressions und den Mechanismus der Paket-Konfiguration von außen dynamisch steuern! Wozu also der ganze Aufwand?</p>  <p>Die Aussage mit den Expressions (Ausdrücken) und der Konfiguration ist für sich genommen natürlich korrekt und wird von mir bzw. meinen Kollegen in Projekten auch verwendet. </p>  <p>Wichtig ist aber die Einsicht, dass sich halt nur "fast" alles damit steuern lässt! Und aufgrund der Architektur der Integration Services lässt sich während der Laufzeit eines Paketes der Inhalt eines Datenflusstasks nicht verändern! Und gerade da setze ich häufig an, um die Erstellung und Wartung von SSIS Paketen weitestgehend zu automatisieren.</p>  <p>Oft sehe ich aber Ansätze von Kunden oder in der Community für dynamisches SSIS, welche so nicht funktionieren können. Um solchen Missverständnissen vorzubeugen, möchte ich heute mal ein Beispiel zeigen, was eben gerade <strong>nicht funktionieren kann</strong>. Den Ansatz brachte neulich ein Kunde zum SSIS Coaching mit.</p>  <p>Also, sein Ansatz sieht vor, dass er zwei Variablen hat. Eine für den Namen einer Tabelle und einen für die SQL Query.</p>  <p><a href="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb.png" width="424" height="123" /></a></p>  <p>Dann kommt er mit der Idee, die Eigenschaft "EvaluateAsExpression" der Variable "SQL" zu nutzen, um die Query zusammenzusetzen. Damit hat die Variable den Value, welcher sich aus der Expression ergibt. </p>  <p><a href="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_3.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_3.png" width="369" height="357" /></a></p>  <p>Nun kommt in einem Datenflusstask eine OLE DB Quelle, in welcher die Variable "SQL" verwendet wird. Alles gut, wir sehen die Query unten. Das scheint zu passen.</p>  <p><a href="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_4.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_4.png" width="546" height="532" /></a></p>  <p>Den Datenfluss erweitern wir nun um einen Multicast, damit er lauffähig wird. Multicast kann ja durchaus aus mal zum Testen von Paketen verwendet werden da es "auch" ein NULL-Ziel sein kann. Noch ein Blick auf die Metadaten, die sind ja das A&amp;O eines Datenflusstasks. Sind auch da. Immer noch alles gut!</p>  <p><a href="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_5.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_5.png" width="642" height="280" /></a> </p>  <p>Und wir lassen das Paket mal laufen. Wenige Sekunden später. Es funktioniert. Also, wozu die ganze Aufregung?</p>  <p><a href="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_6.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_6.png" width="317" height="293" /></a> </p>  <p>Kommen wir zum eigentlichen Zweck der Variablen. Ändern wir die Variable für die Tabelle ab, um eine andere Tabelle als Quelle zu verwenden. Ich habe hier gerade noch die Demotabelle für meinen <a href="http://saschalorenz.blogspot.com/2011/04/integration-services-reporting-services.html" target="_blank">RDLInput</a> liegen, nehmen wir einfach die.</p>  <p><a href="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_7.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_7.png" width="528" height="142" /></a> </p>  <p>Und wieder starte ich das Paket. Und was passiert? Ein Fehler kommt hoch! Hier ist nämlich der Denkfehler versteckt. Und zwar gibt es ein Problem mit den Metadaten.</p>  <p><a href="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_8.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_8.png" width="502" height="216" /></a></p>  <p>Schließen wir die Meldung und öffnen mal unsere Quelle. Und wieder kommt eine Meldung hoch. Und zwar möchte uns die Quelle mitteilen, dass die SQL Query (in der Variable) und die Metadaten der Quelle nicht mehr synchron sind. Also nicht mehr übereinstimmen. Klar, wir wollten nun ja auch eine andere Tabelle haben und natürlich hat diese andere Spalten. Selbst das automatische Beheben des Fehlers würde nur die Quelle "heilen", aber die weiteren Datenflusselemente hätten ebenfalls mit den Metadaten zu kämpfen. Also stände uns viel manuelles Doing bevor, um das alles wieder anzupassen. Die dynamische Konfiguration hat sich also nicht gelohnt.</p>  <p><a href="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_9.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://www.sascha-lorenz.de/blog/dynamischesSSIS_BF76/image_thumb_9.png" width="648" height="283" /></a> </p>  <p>Wie kommt es nun dazu? </p>  <p>Die Architektur der Integration Services sieht vor, dass die Metadaten eines Datenflusstasks zur Entwurfszeit bekannt sind, damit alle der Quelle folgenden Elemente korrekte Input &amp; Output Spalten haben können. Wenn also während der Laufzeit in die Metadaten eingegriffen wird, wie zum Beispiel durch das Neusetzen einer Variable, welche eine Query enthält, dann schützen sich die SSIS und werfen sofort einen Fehler! Wenn Pakete mit den Microsoft Bibliotheken per Repository erzeugt werden, dann befindet sich das Paket in dem Moment ebenfalls im Entwurfsmodus und es können die Metadaten korrekt zugewiesen werden. Das ist die Magie eine SSIS Paket Generators gegenüber der Konfiguration.</p>  <p>Wo dieser Ansatz aber sehr wohl funktioniert, ist eine Umgebung, in der zwar der Tabellenname sich ändern kann, aber die Metadaten (Spalten) identisch bleiben. Selten, kann es aber auch geben. Häufiger kommt eigentlich vor, dass der Connectionstring einer Quelle und eines Ziels mittels Konfiguration geändert wird, damit man zwischen Entwicklungs-, Test- und Produktivumgebung wechseln kann. Das macht durchaus Sinn! :-)</p>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/saschalorenz/2011/05/07/ssis-integration-services-als-etl-3#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/saschalorenz/?tempskin=_rss2&#38;disp=comments&#38;p=2893</wfw:commentRss>
		</item>
				<item>
			<title>SQL Server Reporting Services (SSRS) &#8211; Wof&#252;r k&#246;nnen diese eigentlich alles genutzt werden?</title>
			<link>https://www.insidesql.org/blogs/saschalorenz/2011/05/01/sql-server-reporting-services-ssrs</link>
			<pubDate>Sun, 01 May 2011 10:10:00 +0000</pubDate>			<dc:creator>Sascha Lorenz</dc:creator>
			<category domain="main">SQL Server</category>
<category domain="alt">Einsteiger</category>
<category domain="alt">Business Intelligence</category>			<guid isPermaLink="false">2865@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;Ein schon ein paar Tage zurückliegendes Meeting mit einem Kunden brachte mich auf die Idee für diesen Post.&lt;/p&gt;  &lt;p&gt;Es ging dabei um einen Pitch für den SQL Server und all seine Möglichkeiten. Ihr wisst schon, diese &quot;Zeigen Sie mal, was das kann.&quot; Termine in 90Min. Also war wieder selektives &amp;amp; spontanes Highlights zeigen angesagt. Hat ja keiner die notwenigen 48h Zeit.&lt;/p&gt;  &lt;p&gt;Ein echtes Highlight aus meiner Sicht sind die Reporting Services (SSRS). Aber ähnlich wie die Integration Services (SSIS), welche gerne mal nach wenigen Minuten mit &quot;sagen Sie doch gleich Schnittstelle.&quot; abgetan werden, sind die Reporting Services für viele einfach &quot;ach so, Berichte, haben wir natürlich schon.&quot; und liegen damit wohl verpackt in einer Schublade, die den Möglichkeiten einfach nicht gerecht wird.&lt;/p&gt;  &lt;p&gt;Sofern Ihr auch mal in diese Situation kommen solltet, hier ein paar Anregungen (ohne den Anspruch auf Vollständigkeit) wofür die SQL Server Reporting Services noch alles genutzt werden können. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Berichtswesen (Enterprise Reporting) &amp;amp; Self-Service BI Tool&lt;/strong&gt;     &lt;br /&gt;Klar, das ist DIE Domäne der Reporting Services und da muss sich das Produkt auch nicht vor Marktbegleitern verstecken. Neben den Möglichkeiten im eigentlichen Bericht (Tablix &amp;amp; co), sollte da aber immer auch auf die &quot;Enterprise&quot; Features eingegangen werden, wenn denn ein CIO im Raum ist. Denn Enterprise steht für mich als das Synonym für &quot;Große, komplexe bis unübersichtliche Umgebungen&quot;. Hier können die Reporting Services durch ihren Ansatz als zentraler hochverfügbarer Dienst punkten. Die Verwaltung lässt sich auch weitestgehend automatisieren.&lt;/p&gt;  &lt;p&gt;Nur was kann jetzt noch kommen? Was können die Reporting Services nun noch außer Berichte erzeugen? Eine ganze Menge!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Dashboards      &lt;br /&gt;&lt;/strong&gt;Auf Basis der Reporting Services lassen sich aussagekräftige Armaturenbretter (neudeutsch Dashboards) erstellen. Und dabei können diese von Tachometer (Gauge) bis hin zur Sparkline alle geschätzten Visualisierungsansätze verwirklichen. Diese können, sofern notwendig, sich sogar automatisch in quasi Echtzeit aktualisieren.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Benutzeroberfläche für die Endanwender einer Business Intelligence Lösung&lt;/strong&gt;     &lt;br /&gt;Da ja der Microsoft Business Intelligence Stack keine &quot;eigene&quot; Oberfläche mitbringt, steht der geforderte Berater häufig in der Pflicht hier eine kompetente Aussage machen zu müssen. Die korrekte Antwort wäre hier sicherlich SharePoint, aber es gibt immer wieder Gründe, welche den spontanen Einsatz von SharePoint verhindern. Eigentlich schade, aber was dann? Hier können die Reporting Services helfen, da diese ganz hervorragend ein zentraler Anlaufpunkt für die Endanwender sein können. Des Weiteren bietet die Möglichkeit die RDLs untereinander zu verlinken, dem Endanwender ein geschlossenes Benutzererlebnis. Und Funktionen, welche nicht dabei sind, können in ASP.NET relativ leicht nachgereicht werden. Vielleicht sollte ich später mal mehr zu diesem Punkt schreiben.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Benutzeroberfläche für die ETL/Reporting/BI Prozess Verantwortlichen&lt;/strong&gt;     &lt;br /&gt;Das geht dann natürlich auch, denn irgendjemand ist ja für die Prozesse im Hintergrund verantwortlich und möchte oder sollte sich nicht immer gleich aufs Management Studio stürzen müssen, um mal was nachzusehen. Und wo wir gerade in der IT unterwegs sind. Natürlich lassen sich da auch alle anderen IT Prozesse ganz hervorragend mit kapseln und, über die Möglichkeit klassische Hyperlinks dynamisch einzubinden, auch noch interaktiv steuern.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Export Schnittstelle, welche die Fachabteilungen selbst &quot;pflegen&quot; können (Self-Service Schnittstelle)      &lt;br /&gt;&lt;/strong&gt;Die Reporting Services können ja nicht &quot;nur&quot; HTML, Excel, Word &amp;amp; PDF exportieren, sondern auch schnödes CSV &amp;amp; XML. Damit lassen sich sehr einfach zentral gesteuerte (Zugriffsrechte &amp;amp; co) Schnittstellen für Fachabteilungen aufsetzen, welche dann im Detail, wie zum Beispiel Spaltenwahl, vor Ort gepflegt werden können. Damit lässt sich die eine oder andere Access Installation vermeiden.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Datenquelle&lt;/strong&gt;     &lt;br /&gt;Nun aber, die Reporting Services können nicht nur als Daten-Konsument herhalten, sondern mittels Data Feeds (&amp;amp; CSV s.o.) auch als Datenquelle für weitere Prozesse und Anwendungen. Das wohl mittlerweile prominenteste Beispiel dafür ist PowerPivot, welches sich direkt aus existierenden Reports bedienen kann.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Erzeugen von Images&lt;/strong&gt;     &lt;br /&gt;Und hier noch der Hinweis auf ein häufig unterschätztes Feature der Reporting Services. Es können nämlich sehr einfach Images in fast allen benötigten Formaten (jpg, png etc.) erzeugt werden. Damit lassen sich einige sehr schöne Anforderungen umsetzen! :-)&lt;/p&gt;  &lt;p&gt;Hier endet meine kleine Liste. Wichtig wären mir noch zwei Hinweise:&lt;/p&gt;  &lt;p&gt;1. Berücksichtigt bitte immer, dass die Reporting Services auf unterschiedlichste Wege anzusteuern und einzubinden sind. Erweiterbarkeit und die Möglichkeit der Automatisierung sind meiner Meinung nach fast schon einzigartig für einen &quot;Berichtsserver&quot;. Kreativität zählt hier!&lt;/p&gt;  &lt;p&gt;2. Habt bitte immer ein Auge auf die Lizenzierung der Umgebung! Also wer von den Ergebnissen Eurer Prozesse profitiert und damit lizenziert sein müsste usw. Bei Fragen zu Details dazu wendet Euch bitte einfach an Euren Ansprechpartner bei Microsoft! :-)&lt;/p&gt;</description>
			<content:encoded><![CDATA[<p>Ein schon ein paar Tage zurückliegendes Meeting mit einem Kunden brachte mich auf die Idee für diesen Post.</p>  <p>Es ging dabei um einen Pitch für den SQL Server und all seine Möglichkeiten. Ihr wisst schon, diese "Zeigen Sie mal, was das kann." Termine in 90Min. Also war wieder selektives &amp; spontanes Highlights zeigen angesagt. Hat ja keiner die notwenigen 48h Zeit.</p>  <p>Ein echtes Highlight aus meiner Sicht sind die Reporting Services (SSRS). Aber ähnlich wie die Integration Services (SSIS), welche gerne mal nach wenigen Minuten mit "sagen Sie doch gleich Schnittstelle." abgetan werden, sind die Reporting Services für viele einfach "ach so, Berichte, haben wir natürlich schon." und liegen damit wohl verpackt in einer Schublade, die den Möglichkeiten einfach nicht gerecht wird.</p>  <p>Sofern Ihr auch mal in diese Situation kommen solltet, hier ein paar Anregungen (ohne den Anspruch auf Vollständigkeit) wofür die SQL Server Reporting Services noch alles genutzt werden können. </p>  <p><strong>Berichtswesen (Enterprise Reporting) &amp; Self-Service BI Tool</strong>     <br />Klar, das ist DIE Domäne der Reporting Services und da muss sich das Produkt auch nicht vor Marktbegleitern verstecken. Neben den Möglichkeiten im eigentlichen Bericht (Tablix &amp; co), sollte da aber immer auch auf die "Enterprise" Features eingegangen werden, wenn denn ein CIO im Raum ist. Denn Enterprise steht für mich als das Synonym für "Große, komplexe bis unübersichtliche Umgebungen". Hier können die Reporting Services durch ihren Ansatz als zentraler hochverfügbarer Dienst punkten. Die Verwaltung lässt sich auch weitestgehend automatisieren.</p>  <p>Nur was kann jetzt noch kommen? Was können die Reporting Services nun noch außer Berichte erzeugen? Eine ganze Menge!</p>  <p><strong>Dashboards      <br /></strong>Auf Basis der Reporting Services lassen sich aussagekräftige Armaturenbretter (neudeutsch Dashboards) erstellen. Und dabei können diese von Tachometer (Gauge) bis hin zur Sparkline alle geschätzten Visualisierungsansätze verwirklichen. Diese können, sofern notwendig, sich sogar automatisch in quasi Echtzeit aktualisieren.</p>  <p><strong>Benutzeroberfläche für die Endanwender einer Business Intelligence Lösung</strong>     <br />Da ja der Microsoft Business Intelligence Stack keine "eigene" Oberfläche mitbringt, steht der geforderte Berater häufig in der Pflicht hier eine kompetente Aussage machen zu müssen. Die korrekte Antwort wäre hier sicherlich SharePoint, aber es gibt immer wieder Gründe, welche den spontanen Einsatz von SharePoint verhindern. Eigentlich schade, aber was dann? Hier können die Reporting Services helfen, da diese ganz hervorragend ein zentraler Anlaufpunkt für die Endanwender sein können. Des Weiteren bietet die Möglichkeit die RDLs untereinander zu verlinken, dem Endanwender ein geschlossenes Benutzererlebnis. Und Funktionen, welche nicht dabei sind, können in ASP.NET relativ leicht nachgereicht werden. Vielleicht sollte ich später mal mehr zu diesem Punkt schreiben.</p>  <p><strong>Benutzeroberfläche für die ETL/Reporting/BI Prozess Verantwortlichen</strong>     <br />Das geht dann natürlich auch, denn irgendjemand ist ja für die Prozesse im Hintergrund verantwortlich und möchte oder sollte sich nicht immer gleich aufs Management Studio stürzen müssen, um mal was nachzusehen. Und wo wir gerade in der IT unterwegs sind. Natürlich lassen sich da auch alle anderen IT Prozesse ganz hervorragend mit kapseln und, über die Möglichkeit klassische Hyperlinks dynamisch einzubinden, auch noch interaktiv steuern.</p>  <p><strong>Export Schnittstelle, welche die Fachabteilungen selbst "pflegen" können (Self-Service Schnittstelle)      <br /></strong>Die Reporting Services können ja nicht "nur" HTML, Excel, Word &amp; PDF exportieren, sondern auch schnödes CSV &amp; XML. Damit lassen sich sehr einfach zentral gesteuerte (Zugriffsrechte &amp; co) Schnittstellen für Fachabteilungen aufsetzen, welche dann im Detail, wie zum Beispiel Spaltenwahl, vor Ort gepflegt werden können. Damit lässt sich die eine oder andere Access Installation vermeiden.     <br />    <br /><strong>Datenquelle</strong>     <br />Nun aber, die Reporting Services können nicht nur als Daten-Konsument herhalten, sondern mittels Data Feeds (&amp; CSV s.o.) auch als Datenquelle für weitere Prozesse und Anwendungen. Das wohl mittlerweile prominenteste Beispiel dafür ist PowerPivot, welches sich direkt aus existierenden Reports bedienen kann.</p>  <p><strong>Erzeugen von Images</strong>     <br />Und hier noch der Hinweis auf ein häufig unterschätztes Feature der Reporting Services. Es können nämlich sehr einfach Images in fast allen benötigten Formaten (jpg, png etc.) erzeugt werden. Damit lassen sich einige sehr schöne Anforderungen umsetzen! :-)</p>  <p>Hier endet meine kleine Liste. Wichtig wären mir noch zwei Hinweise:</p>  <p>1. Berücksichtigt bitte immer, dass die Reporting Services auf unterschiedlichste Wege anzusteuern und einzubinden sind. Erweiterbarkeit und die Möglichkeit der Automatisierung sind meiner Meinung nach fast schon einzigartig für einen "Berichtsserver". Kreativität zählt hier!</p>  <p>2. Habt bitte immer ein Auge auf die Lizenzierung der Umgebung! Also wer von den Ergebnissen Eurer Prozesse profitiert und damit lizenziert sein müsste usw. Bei Fragen zu Details dazu wendet Euch bitte einfach an Euren Ansprechpartner bei Microsoft! :-)</p>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/saschalorenz/2011/05/01/sql-server-reporting-services-ssrs#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/saschalorenz/?tempskin=_rss2&#38;disp=comments&#38;p=2865</wfw:commentRss>
		</item>
				<item>
			<title>Coaches&#8217; Hell: Wie entwickle ich denn jetzt so ein Vorgehensmodell f&#252;r Microsoft Business Intelligence Projekte?</title>
			<link>https://www.insidesql.org/blogs/saschalorenz/2011/02/25/coachesarsquo-hell-wie-entwickle-ich-denn-jetzt-so-ein-vorgehensmodell-fauuml-r-microsoft-business-intelligence-projekte</link>
			<pubDate>Fri, 25 Feb 2011 17:11:53 +0000</pubDate>			<dc:creator>Sascha Lorenz</dc:creator>
			<category domain="main">SQL Server</category>
<category domain="alt">Einsteiger</category>
<category domain="alt">Business Intelligence</category>			<guid isPermaLink="false">2704@https://www.insidesql.org/blogs/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://saschalorenz.blogspot.com/2011/02/coaches-diary-wie-verwende-ich-ssis.html&quot;&gt;Kaum schreibe ich ein wenig aus der Praxis als Coach&lt;/a&gt;, schon kommen die Fragen. Bin ja selbst schuld.&lt;/p&gt;  &lt;p&gt;Der Hinweis, doch bitte ein Vorgehensmodell zu nutzen, hat Wellen geschlagen. Denn wie kommt denn nun der interne als auch externe BI Entwickler/Implementierer/Berater an ein solches Vorgehensmodell. Oder fassen wir die Frage ein wenig allgemeiner: Wie kommt ein Unternehmen, welches den Microsoft Business Intelligence Stack einführen möchte, an einen entsprechenden Plan?&lt;/p&gt;  &lt;p&gt;Und was ist überhaupt so ein Modell? Ein Projektplan? Nein, ist es nicht, sondern eher eine Art Handlungsanweisung zur Erreichung des Ziels. Nenne wir es mal nicht Karte sondern Kompass! Dieser Vergleich leuchtet vielen meist schnell ein! Projektplan ist die Karte, Modell der Kompass!&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;&lt;a href=&quot;https://www.insidesql.org/blogs/saschalorenz/2011/02/25/coachesarsquo-hell-wie-entwickle-ich-denn-jetzt-so-ein-vorgehensmodell-fauuml-r-microsoft-business-intelligence-projekte#more2704&quot;&gt;Ganze Geschichte &amp;raquo;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://saschalorenz.blogspot.com/2011/02/coaches-diary-wie-verwende-ich-ssis.html">Kaum schreibe ich ein wenig aus der Praxis als Coach</a>, schon kommen die Fragen. Bin ja selbst schuld.</p>  <p>Der Hinweis, doch bitte ein Vorgehensmodell zu nutzen, hat Wellen geschlagen. Denn wie kommt denn nun der interne als auch externe BI Entwickler/Implementierer/Berater an ein solches Vorgehensmodell. Oder fassen wir die Frage ein wenig allgemeiner: Wie kommt ein Unternehmen, welches den Microsoft Business Intelligence Stack einführen möchte, an einen entsprechenden Plan?</p>  <p>Und was ist überhaupt so ein Modell? Ein Projektplan? Nein, ist es nicht, sondern eher eine Art Handlungsanweisung zur Erreichung des Ziels. Nenne wir es mal nicht Karte sondern Kompass! Dieser Vergleich leuchtet vielen meist schnell ein! Projektplan ist die Karte, Modell der Kompass!</p>  <p></p><a href="https://www.insidesql.org/blogs/saschalorenz/2011/02/25/coachesarsquo-hell-wie-entwickle-ich-denn-jetzt-so-ein-vorgehensmodell-fauuml-r-microsoft-business-intelligence-projekte#more2704">Ganze Geschichte &raquo;</a>]]></content:encoded>
								<comments>https://www.insidesql.org/blogs/saschalorenz/2011/02/25/coachesarsquo-hell-wie-entwickle-ich-denn-jetzt-so-ein-vorgehensmodell-fauuml-r-microsoft-business-intelligence-projekte#comments</comments>
			<wfw:commentRss>https://www.insidesql.org/blogs/saschalorenz/?tempskin=_rss2&#38;disp=comments&#38;p=2704</wfw:commentRss>
		</item>
			</channel>
</rss>
