<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-11574504</id><updated>2011-12-28T15:26:26.057+01:00</updated><category term='Repository driven BI'/><category term='Partner Technical Communities'/><category term='Replikation'/><category term='SQL Server 2008'/><category term='Cast'/><category term='SQL Server'/><category term='SharePoint'/><category term='PowerPoint Tipps'/><category term='SQLBits'/><category term='Business Intelligence'/><category term='Veröffentlichungen'/><category term='BizTalk Server'/><category term='Die einzige Wahrheit'/><category term='Performance Point Server'/><category term='Windows Phone 7'/><category term='IAMCP'/><category term='Einsteiger'/><category term='PASS Deutschland e.V.'/><category term='Projektmanagement'/><category term='WIndows Server'/><category term='.net'/><category term='Cebit'/><category term='PSG'/><category term='PASS Cast'/><category term='Silverlight'/><title type='text'>Sascha Lorenz</title><subtitle type='html'>Sascha Lorenz aus Hamburg über die Themen Microsoft SQL Server, SharePoint, .NET Technologien und ganz allgemein über Business Intelligence.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://saschalorenz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default?start-index=101&amp;max-results=100'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>256</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11574504.post-4876060520544637322</id><published>2011-07-14T21:14:00.001+02:00</published><updated>2011-07-14T21:14:38.819+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Wo ist Project Crescent in SQL Server Denali CTP 3?</title><content type='html'>&lt;p&gt;So, seit wenigen Tagen (nun ja, fast Stunden) ist die &lt;a href="https://www.microsoft.com/betaexperience/pd/SQLDCTP3CTA/enus/default.aspx"&gt;CTP 3 vom SQL Server Denali&lt;/a&gt; draußen. Und groß in der Ankündigung von Microsoft steht drin, dass auch das sagenumwogende “Project Crescent” dabei sein soll. &lt;/p&gt;  &lt;p&gt;Und schon geht die Sucherei los. Wo ist Crescent? Wir wollen auch diese ultra-coolen Reports bauen! &lt;/p&gt;  &lt;p&gt;Die Antwort dazu ist relativ einfach. Es ist dabei, aber… Crescent ist ein Bestandteil von &lt;strong&gt;PowerPivot für SharePoint! &lt;/strong&gt;Und das wiederum bedeutet, dass Ihr einen SharePoint 2010 Enterprise mit Service Pack 1 für die Nutzung von Crescent benötigt. &lt;/p&gt;  &lt;p&gt;Details findet Ihr hier: &lt;a href="http://msdn.microsoft.com/en-us/library/hh231687(v=SQL.110).aspx"&gt;Deployment Checklist: Reporting Services, Project Crescent, and PowerPivot for SharePoint&lt;/a&gt;&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:right; margin:0px; padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fsaschalorenz.blogspot.com%2f2011%2f07%2fwo-ist-project-crescent-in-sql-server.html&amp;amp;title=Wo+ist+Project+Crescent+in+SQL+Server+Denali+CTP+3%3f"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border: 0" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4876060520544637322?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4876060520544637322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4876060520544637322'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/07/wo-ist-project-crescent-in-sql-server.html' title='Wo ist Project Crescent in SQL Server Denali CTP 3?'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-7546618105661252319</id><published>2011-06-17T14:24:00.001+02:00</published><updated>2011-06-17T14:24:10.604+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Mehr zu MERGE in T-SQL - Der Cursor Alternative!</title><content type='html'>&lt;p&gt;Zu meinem Post über den &lt;a href="http://saschalorenz.blogspot.com/2011/06/merge-in-t-sql-der-unbekannte-befehl-im.html"&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 “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.&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 “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 &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 “ausgebremst” wird. Der SQL Server wirft sonst folgende Fehlermeldung:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“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.”&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;&lt;div class="wlWriterHeaderFooter" style="text-align:right; margin:0px; padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fsaschalorenz.blogspot.com%2f2011%2f06%2fmehr-zu-merge-in-t-sql-der-cursor.html&amp;amp;title=Mehr+zu+MERGE+in+T-SQL+-+Der+Cursor+Alternative!"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border: 0" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-7546618105661252319?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7546618105661252319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7546618105661252319'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/06/mehr-zu-merge-in-t-sql-der-cursor.html' title='Mehr zu MERGE in T-SQL - Der Cursor Alternative!'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-848906319732557960</id><published>2011-06-09T09:39:00.001+02:00</published><updated>2011-06-09T09:39:40.978+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Partner Technical Communities'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Einsteiger'/><title type='text'>Community Webcast Reihe: Das kleine SQL Server 1x1 für Software Entwickler auf Channel 9</title><content type='html'>&lt;p&gt;Gestern ist auf &lt;a href="http://channel9.msdn.com/Blogs/Lori/Einfhrung--bersicht-ber-den-SQL-Server"&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 “Klappentext”:&lt;/p&gt;  &lt;p&gt;“&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.”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-bl5mgKuKl-k/TfB4nUeFDCI/AAAAAAAAAX8/xUHSWt9zfaU/s1600-h/image%25255B4%25255D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-DsFzPSvzm_s/TfB4uoXn3SI/AAAAAAAAAYA/kPfq8PZbpiA/image_thumb%25255B2%25255D.png?imgmax=800" width="341" height="192" /&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;&lt;div class="wlWriterHeaderFooter" style="text-align:right; margin:0px; padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fsaschalorenz.blogspot.com%2f2011%2f06%2fcommunity-webcast-reihe-das-kleine-sql.html&amp;amp;title=Community+Webcast+Reihe%3a+Das+kleine+SQL+Server+1x1+f%c3%bcr+Software+Entwickler+auf+Channel+9"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border: 0" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-848906319732557960?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/848906319732557960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/848906319732557960'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/06/community-webcast-reihe-das-kleine-sql.html' title='Community Webcast Reihe: Das kleine SQL Server 1x1 für Software Entwickler auf Channel 9'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-DsFzPSvzm_s/TfB4uoXn3SI/AAAAAAAAAYA/kPfq8PZbpiA/s72-c/image_thumb%25255B2%25255D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-368856179208938364</id><published>2011-06-08T10:03:00.001+02:00</published><updated>2011-06-08T10:03:21.011+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Veröffentlichungen'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>BASTA! 2011 – Bin als Sprecher dabei</title><content type='html'>&lt;p&gt;Vom 26. bis zum 30.09.2011 findet in Mainz wieder die &lt;a href="http://www.basta.de"&gt;BASTA!&lt;/a&gt; statt. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Was ist die BASTA! ?&lt;/strong&gt;    &lt;br /&gt;“&lt;em&gt;Die BASTA! ist die renommierteste unabhängige Konferenz für .NET-Technologien im deutschsprachigen Raum. Hier kommen die besten Experten aus ganz Europa zusammen, um Ihnen ihr praxiserprobtes Wissen und ihre Erfahrung weiter zu geben. Technisches Know-how auf höchstem Niveau für Entwickler, exzellentes Erfahrungswissen für Softwarearchitekten und Projektleiter – das ist es, was die BASTA! auszeichnet&lt;/em&gt;.” Zitat von der Website&lt;/p&gt;  &lt;p&gt;Die BASTA! setzt sich mittlerweile aus drei “Konferenzen” zusammen:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;BASTA! – Entwickler, Entwickler…&lt;/li&gt;    &lt;li&gt;SQLCON – SQL Server…&lt;/li&gt;    &lt;li&gt;ShareConnect – SharePoint Server…&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Und als Teil der SQLCON darf ich dieses Jahr zwei Vorträge zu meinen Lieblingsthemen halten:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Die Entwicklersicht auf Microsofts Business Intelligence am 27.09.2011 | 17:15 - 18:30 Uhr&lt;/strong&gt;    &lt;br /&gt;In dieser Session wird anhand von Beispielen gezeigt, wie durch die Nutzung der offenen und dokumentierten APIs des SQL Servers und seiner Dienste BI-Projekte deutlich effektiver geplant und durchgeführt werden können. Es werden sowohl Anregungen für den gestandenen BI-Berater zur Nutzung von .NET-Code gegeben als auch Beispiele für Entwickler für die Integration in ihren Lösungen gezeigt.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Entwicklung eigener Business Intelligence Clients am 28.09.2011 | 08:30 - 09:45 Uhr&lt;/strong&gt;    &lt;br /&gt;In dieser Session wird gezeigt, wo der Nutzen in der Erstellung eigener Clients für operative und analytische BI liegt und wie diese mit dem SQL Server und C# entwickelt werden können. Dafür werden die Technologien Analysis Services, Integration Services, ADOMD.NET, AMO, WinForms, ASP.NET und Silverlight miteinander kombiniert vorgestellt.&lt;/p&gt;  &lt;p&gt;Das verspricht ein cooles Event zu werden! Freue mich schon drauf. Vielleicht treffe ich ja auch wieder den einen oder anderen von Euch.&lt;/p&gt;  &lt;p&gt;Weitere Details findet Ihr u.a. auf &lt;a title="http://basta.net/2011/sessions/?l=de&amp;amp;id=5&amp;amp;tid=2015" href="http://basta.net/2011/sessions/?l=de&amp;amp;id=5&amp;amp;tid=2015"&gt;http://basta.net/2011/sessions/?l=de&amp;amp;id=5&amp;amp;tid=2015&lt;/a&gt;.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:right; margin:0px; padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fsaschalorenz.blogspot.com%2f2011%2f06%2fbasta-2011-bin-als-sprecher-dabei.html&amp;amp;title=BASTA!+2011+%e2%80%93+Bin+als+Sprecher+dabei"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border: 0" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-368856179208938364?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/368856179208938364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/368856179208938364'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/06/basta-2011-bin-als-sprecher-dabei.html' title='BASTA! 2011 – Bin als Sprecher dabei'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-778239015513872124</id><published>2011-06-07T13:09:00.001+02:00</published><updated>2011-06-07T13:09:43.763+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>MERGE in T-SQL – Der unbekannte Befehl im BI Projekt für ELT</title><content type='html'>&lt;p&gt;Wenn ich Diskussionen über die &lt;a href="http://saschalorenz.blogspot.com/2011/05/ssis-integration-services-etl-vs-elt.html"&gt;Entscheidung für eine ETL oder ELT Architektur&lt;/a&gt; führe oder auch nur moderiere, dann bringe ich als ein mögliches Beispiel für eine ELT Architektur gerne die Verwendung des MERGE Befehls. Nur wenige scheinen diesen Befehl bisher aktiv zu nutzen, dabei ist er schon seit SQL Server 2008 dabei und gehört auch zum &lt;a href="http://en.wikipedia.org/wiki/SQL:2008"&gt;SQL:2008&lt;/a&gt; Standard!&lt;/p&gt;  &lt;p&gt;Was macht nun der Befehl MERGE? Laut den BOL das hier: &lt;/p&gt;  &lt;p&gt;&lt;em&gt;“Führt Einfüge-, Aktualisierungs- oder Löschvorgänge in einer Zieltabelle anhand der Ergebnisse eines Joins mit einer Quelltabelle aus. Sie können z. B. zwei Tabellen synchronisieren, indem Sie Zeilen in einer Tabelle anhand von Unterschieden, die in der anderen Tabelle gefunden wurden, einfügen, aktualisieren oder löschen.”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Und damit ist er perfekt geeignet für den Ladeprozess von Dimensionen in Data Warehouse/BI Projekten. Denn dort benötigen wir ja sowohl ein INSERT als auch ein UPDATE für unsere Geschäftsobjekte in den Dimensionen. Ok, und ganz selten mal ein DELETE, sollte aber nicht die Regel sein. &lt;/p&gt;  &lt;p&gt;Wie wende ich MERGE nun an? Auf den ersten Blick wirkt der MERGE Befehl ein wenig “unübersichtlich”.&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;qQuelle&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;meist ein Update&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;Wie muss ein MERGE Befehl gelesen werden? Also, wir haben hinter dem MERGE das sogenannte “Ziel” und hinter dem USING die “Quelle”. Über das ON werden diese beiden verbunden (join). Nun kommt das WHEN MATCHED THEN. Hier kommt unsere Aktion hin, welche ausgeführt wird bei einer Erfüllung der Bedingung. Ok, und bei WHEN NOT MATCHED kommt halt die Aktion, wenn die Bedingung nicht erfüllt wurde. Soweit ganz einfach, oder?&lt;/p&gt;  &lt;p&gt;Hier ein erstes einfaches Beispiel:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;MERGE DimTarget as t      &lt;br /&gt;USING ELTSource as s       &lt;br /&gt;ON t.bk = s.bk       &lt;br /&gt;WHEN MATCHED THEN      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; update set t.bk = s.bk, t.attribute1 = s.attribute1, t.attribute2 = s.attribute2&amp;#160; &lt;br /&gt;WHEN NOT MATCHED THEN      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; insert (bk, attribute1, attribute2)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; values (s.bk, s.attribute1, s.attribute2);&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Das war doch schon nicht schlecht. Nun ist es aber so, dass hier wenn immer der BK (BusinessKey, Geschäftsschlüssel aus der DWH Lehre…) gleich ist auch ein Update durchgeführt wird. Das sollte natürlich nur sein, wenn sich was an den Attributen geändert hat! Eine erste Idee wäre nun die ON Klausel zu erweitern, aber dadurch würden wir unser Zielt nicht erreichen, da dann ja der Vergleich auf den BK nicht mehr passt. Wir benötigen eigentlich eine Zweiteilung der Bedingung, also wenn BK gleich und Attribute ungleich. MERGE unterstützt dies, indem wir das “WHEN &lt;em&gt;MATCHED&lt;/em&gt;” erweitern!&lt;/p&gt;  &lt;p&gt;&lt;em&gt;MERGE DimTarget as t      &lt;br /&gt;USING ELTSource as s       &lt;br /&gt;ON t.bk = s.bk&amp;#160; &lt;br /&gt;WHEN MATCHED AND&lt;strong&gt; (t.attribute1 != s.attribute1 or t.attribute2 != s.attribute2)&amp;#160; &lt;br /&gt;&lt;/strong&gt;&amp;#160;&amp;#160;&amp;#160; THEN      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; update set t.bk = s.bk, t.attribute1 = s.attribute1, t.attribute2 = s.attribute2&amp;#160; &lt;br /&gt;WHEN NOT MATCHED      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; THEN      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insert (bk, attribute1, attribute2)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; values (s.bk, s.attribute1, s.attribute2);&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Das ist schon eine deutliche Vereinfachung, aber nun kommt die Herausforderung der Slowly Changing Dimensionen vom Typ 2, also dem Historisieren von Attributen. Wie lässt sich so etwas nun mittels MERGE realisieren? Gar nicht! Wobei das so natürlich nicht stimmt, aber wir brauchen ein ganz klein wenig mehr als nur ein MERGE.&lt;/p&gt;  &lt;p&gt;Aber zuerst mal kurz nachdenken, was wir bei einem SCD2 tatsächlich alles an möglichen Fällen haben.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;BK ist neu, damit auch die Zeile –&amp;gt; Insert&lt;/li&gt;    &lt;li&gt;BK ist bekannt, aber es wurden nur Typ 1 (also überschreiben) Attribute geändert –&amp;gt; Update&lt;/li&gt;    &lt;li&gt;BK ist bekannt und es haben sich Attribute vom Typ 2 geändert –&amp;gt; Update (von aktiv auf inaktiv) &amp;amp; Insert (also die neue aktive Zeile) !&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Fangen wir einfach mal an.&lt;/p&gt;  &lt;p&gt;MERGE DimTarget AS t   &lt;br /&gt;USING ELTSource AS s    &lt;br /&gt;ON t.bk = s.bk    &lt;br /&gt;WHEN MATCHED AND t.aktiv = 1 AND t.attribute2 != s.attribute2    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; THEN -– BK ist gleich und Attribute hat sich geändert, daher auf inaktiv setzen     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UPDATE SET t.aktiv = 0, t.ende_datum = getdate(), t.attribute2 = s.attribute2    &lt;br /&gt;WHEN NOT MATCHED     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; THEN -– BK ist unbekannt, daher neuer Satz    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; INSERT (bk, attribute1, attribute2, aktiv, start_datum)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; VALUES (s.bk, s.attribute1, s.attribute2,1, getdate());&lt;/p&gt;  &lt;p&gt;Nur wie bekommen wir jetzt die neuen Zeilen hinzugefügt, nachdem wir die “alten” auf inaktiv gesetzt haben? Dafür benötigen wir ein wenig Hilfe von einer Klausel, welche aber auch relativ unbekannt ist. Und zwar OUTPUT. by the way, UPDATE, INSERT &amp;amp; DELETE kennen die auch! Ist äußerst nützlich.&lt;/p&gt;  &lt;p&gt;MERGE DimTarget AS t   &lt;br /&gt;USING ELTSource AS s    &lt;br /&gt;ON t.bk = s.bk    &lt;br /&gt;WHEN MATCHED AND t.aktiv = 1 AND t.attribute2 != s.attribute2    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; THEN&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UPDATE SET t.aktiv = 0, t.ende_datum = getdate()    &lt;br /&gt;WHEN NOT MATCHED     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; THEN     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; INSERT (bk, attribute1, attribute2, aktiv, start_datum)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; VALUES (s.bk, s.attribute1, s.attribute2,1, getdate())    &lt;br /&gt;OUTPUT $Action Befehl, s.bk, s.attribute1, s.attribute2;&lt;/p&gt;  &lt;p&gt;Damit bekommen wir quasi als Resultat des MERGE Befehls eine Zusammenfassung der durchgeführten Aktionen. Uns interessieren wiederum nur die UPDATEs und nutzen den Output für ein INSERT als Input. &lt;/p&gt;  &lt;p&gt;INSERT INTO DimTarget   &lt;br /&gt;SELECT bk, attribute1, attribute2, 1, GETDATE(), null    &lt;br /&gt;FROM    &lt;br /&gt;(    &lt;br /&gt;&amp;#160; MERGE DimTarget AS t    &lt;br /&gt;&amp;#160; USING ELTSource AS s    &lt;br /&gt;&amp;#160; ON t.bk = s.bk    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WHEN MATCHED AND t.aktiv = 1 AND t.attribute2 != s.attribute2    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; THEN     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UPDATE SET t.aktiv = 0, t.ende_datum = getdate()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WHEN NOT MATCHED    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; THEN    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; INSERT (bk, attribute1, attribute2, aktiv, start_datum)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; VALUES (s.bk, s.attribute1, s.attribute2,1, getdate())    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; OUTPUT $Action Befehl, s.bk, s.attribute1, s.attribute2    &lt;br /&gt;) AS out    &lt;br /&gt;WHERE Befehl = 'UPDATE';&lt;/p&gt;  &lt;p&gt;Und schon haben wir in nur einem Befehl Slowly Changing Dimensions Typ 2 abgebildet. Der Vorteil der Verwendung von MERGE ist, dass Quelle und Ziel nur einmal durchlaufen werden müssen für alle Operationen, da für alles nur ein Queryplan erstellt wird. Gerade bei größeren Datenmengen können ELT Architekturen damit deutlich vereinfacht und beschleunigt werden!&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:right; margin:0px; padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fsaschalorenz.blogspot.com%2f2011%2f06%2fmerge-in-t-sql-der-unbekannte-befehl-im.html&amp;amp;title=MERGE+in+T-SQL+%e2%80%93+Der+unbekannte+Befehl+im+BI+Projekt+f%c3%bcr+ELT"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border: 0" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-778239015513872124?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/778239015513872124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/778239015513872124'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/06/merge-in-t-sql-der-unbekannte-befehl-im.html' title='MERGE in T-SQL – Der unbekannte Befehl im BI Projekt für ELT'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-2632755266478854966</id><published>2011-06-04T15:59:00.001+02:00</published><updated>2011-06-04T16:00:01.634+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>MDXScript Service – Repository driven calculations</title><content type='html'>&lt;p&gt;Vor einiger Zeit hatte ich ja schon mal beschrieben wie das &lt;a href="http://saschalorenz.blogspot.com/2010/11/mdxscript-object-in-analysis-management.html"&gt;MDXScript Objekt ohne das BIDS bzw. den BIDS Helper&lt;/a&gt; geändert werden kann. Des Öfteren wurde ich danach gefragt, wozu denn so etwas gut sein soll. Wenn der Würfel neu verarbeitet wird, dann wird das MDXScript doch eh neu durchgerechnet. &lt;/p&gt;  &lt;p&gt;Nun ja, so einfach ist es dann nicht!&lt;/p&gt;  &lt;p&gt;Das MDXScript wird ja nicht durchgerechnet! Es wird einfach in der OLAP Datenbank (aka Cube) bereitgestellt. Erst wenn Teile des MDXScriptes für das Auflösen einer MDX Query benötigt werden, wird es genutzt! Des Weiteren bleibt die eigentliche Analysis Services Datenbank gültig und alles Verbindungen bestehen. Diese Tatsachen ermöglichen einige interessante Lösungen! :-)&lt;/p&gt;  &lt;p&gt;Zum Beispiel die Bereitstellung eines &lt;strong&gt;MDXScript Services&lt;/strong&gt;! Auch gerne Calculations Services genannt. &lt;/p&gt;  &lt;p&gt;Die Idee dahinter ist recht einfach und wird von mir gerne verwendet, wenn des Öfteren im Laufe eines Tages eine dynamische Änderung bzw. Anpassung eines “Würfels” notwendig ist und der verwendete Client diese Art von Änderung nicht unterstützt. Zum Beispiel um Szenarien dynamisch mittels Scope Anweisungen durchzurechnen. Es ist durchaus möglich, dass mehrere Anwender voneinander getrennt diesen Dienst für einen Würfel nutzen können, wenn die Zuweisung über ein Member eines Szenario Attributes gesteuert wird.&lt;/p&gt;  &lt;p&gt;Alle einzelnen Berechnungen (neue Member, Scopes, KPIs etc.) liegen in einer relationalen Datenbank oder auch in einer SharePoint Liste vor. Die Berechnungen können entweder manuell gepflegt oder, was häufiger der Fall ist, durch eine Anwendung erzeug werden. Die einzelnen Statements werden dann zu einem String zusammengesetzt und als ein MDXScript veröffentlicht. Und alle Änderungen am Würfel sind sofort online und sichtbar! Häufig geht die kreative Verwendung von Scope Anweisungen auch weit über die Möglichkeiten des Update Statements hinaus.&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:right; margin:0px; padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fsaschalorenz.blogspot.com%2f2011%2f06%2fmdxscript-service-repository-driven.html&amp;amp;title=MDXScript+Service+%e2%80%93+Repository+driven+calculations"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border: 0" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-2632755266478854966?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2632755266478854966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2632755266478854966'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/06/mdxscript-service-repository-driven.html' title='MDXScript Service – Repository driven calculations'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4295606376610171719</id><published>2011-06-02T19:44:00.003+02:00</published><updated>2011-06-03T07:43:54.864+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='Projektmanagement'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server Versionen &amp; Editionen im Vergleich – Entscheidung vor dem BI Projekt?</title><content type='html'>Immer wieder werde ich gefragt, welche Edition denn nun für ein BI Vorhaben bzw. Projekt die geeignete sei? Hintergrund dieser Frage ist häufig die Entscheidung zwischen der sogenannten “Standard” und “Enterprise” Edition.&lt;br /&gt;&lt;br /&gt;Des Weiteren kommt häufig die Frage, ob sich denn der Wechsel auf eine aktuellere Version lohnen würde? Viele Kunden von Microsoft haben einen SQL Server 2008 im Einsatz und noch mehr einen SQL Server 2005. Und natürlich gibt es noch durchaus Anwender des SQL Server 7 &amp;amp; 2000, aber da stellt sich aus Supportsicht die Frage eigentlich nicht.&lt;br /&gt;&lt;br /&gt;Oft kommt auch noch die Frage, ob sich denn das Warten auf die nächste Version lohnen würde. Zurzeit warten wir ja alle ganz gespannt auf SQL Server 2011 aka Denali.&lt;br /&gt;&lt;br /&gt;Und natürlich ist der Fragesteller dann immer schnell bei der Hand die guten alten “Best Practices” zu bemühen. Also da muss es doch auch so eine richtig vs. falsch Regel für geben. Wieder mal gibt es diese nicht, denn die Antwort auf so eine Frage kann natürlich nur das wiederum gute alte “Kommt ganz drauf an…” sein.&lt;br /&gt;&lt;br /&gt;Ach ja, das Thema Lizenzierung lassen wir mal für den Moment ganz außen vor, ist aber nicht weniger spannend! Glaubt mir!&lt;br /&gt;&lt;br /&gt;Ich will hier nun keinen detaillierten Vergleich der Editionen durchführen. Dafür hat Microsoft selbst gute Seiten. Siehe unten.&lt;br /&gt;&lt;br /&gt;Fangen wir mit der häufigsten Frage an. Welche Edition für das Projekt?&lt;br /&gt;&lt;br /&gt;Immer wieder habe ich in Workshops und Proof-of-Concepts die Diskussion, dass Kunden &amp;amp; Partner erwarten die gerade für sie “selbstverständlichen” Features in der Standard Edition vorzufinden. Mein Einwand ist dann meist, dass es sich da um ein semantisches Missverständnis handelt. Nicht nur, dass der SQL Server mit seinem Namen eh schon ein Problem hat, da die wenigsten BDM bei etwas mit diesem Namen eine komplette “Data Plattform inkl. BI” vermuten, sondern auch “Standard” in Abgrenzung zu “Enterprise” ist verwirrend in der Kommunikation.&lt;br /&gt;Daher beantworte ich diese Frage meist damit, dass in meinem Verständnis die “Enterprise” Edition die eigentliche “Standard” Edition ist. Schon verwirrend, was für Labels der Hersteller da auf seine Boxen klebt. :-)&lt;br /&gt;&lt;br /&gt;Die eigentliche “Enterprise” Edition, also das was viele damit verbinden (GROSSE Umgebungen…), ist für mich die “Data Center” Edition. In der “Data Center” Edition liegt zum Beispiel die Premium Edition von StreamInsight bei. Die wird benötigt für Umgebungen mit mehr als 5000 Events pro Sekunde und einer Latenz unter 5 Sek. Das ist sehr wahrscheinlich gar nicht so selten. Wesentlich bekannter ist die Eigenschaft, dass sie tatsächlich alle verfügbaren CPUs des Betriebssystems unterstützt. Und wem das nicht genug ist, kann ja gerne mal auf die “Fast Track” Konfiguration und “Parallel Data Warehouse” Edition hinweisen!&lt;br /&gt;&lt;br /&gt;Nur was sind denn jetzt die wesentlichen Unterschiede in den Editionen (Standard vs. Enterprise) bezogen auf Business Intelligence Projekte?&lt;br /&gt;&lt;br /&gt;Unterscheiden wir mal die einzelnen Dienste des SQL Server 2008 R2:&lt;br /&gt;&lt;br /&gt;In der &lt;strong&gt;Datenbank Engine&lt;/strong&gt; sind die wesentlichen Unterschiede in der “Enterprise” Edition:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;wichtig für &lt;strong&gt;Data Warehouse&lt;/strong&gt; Umgebungen&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Partitionierung in der relationalen Datenbank&lt;/li&gt;&lt;li&gt;Parallele Indexvorgänge&lt;/li&gt;&lt;li&gt;volle Unterstützung von Indizierte Sichten&lt;/li&gt;&lt;li&gt;Datenkomprimierung&lt;/li&gt;&lt;li&gt;Optimierung von Sternjoinabfragen&lt;/li&gt;&lt;li&gt;SQL Server Audit&lt;/li&gt;&lt;li&gt;Transparente Datenbankverschlüsselung&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;praktisch für &lt;strong&gt;Integrationsprozesse&lt;/strong&gt; (ETL/ELT) im Quellsystem&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Datenbank-Momentaufnahmen (Snapshots)&lt;/li&gt;&lt;li&gt;Change Data Capture&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;In den SQL Server &lt;strong&gt;Integration Services&lt;/strong&gt; (SSIS) kommt folgendes hinzu:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;High-Performance-Oracle-Ziel&lt;/li&gt;&lt;li&gt;High-Performance-Teradata-Ziel&lt;/li&gt;&lt;li&gt;SAP BW-Quelle und –Ziel (ja, ja… so etwas gibst!)&lt;/li&gt;&lt;li&gt;Zieladapter des Data Mining-Modelltrainings&lt;/li&gt;&lt;li&gt;Zieladapter für Dimensionsverarbeitung&lt;/li&gt;&lt;li&gt;Zieladapter für Partitionsverarbeitung&lt;/li&gt;&lt;li&gt;Persistente Suchen&lt;/li&gt;&lt;li&gt;Fuzzygruppierung und –suche&lt;/li&gt;&lt;li&gt;Ausdrucksextrahierung und -suche&lt;/li&gt;&lt;/ul&gt;Bei den &lt;strong&gt;Analysis Services&lt;/strong&gt; (SSAS) würde uns ohne “Enterprise” Edition folgendes fehlen:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Partitionierte Cubes&lt;/li&gt;&lt;li&gt;Finanzaggregationen &amp;amp; Kontointelligenz&lt;/li&gt;&lt;li&gt;Semiadditive Measures&lt;/li&gt;&lt;/ul&gt;Vorsicht, das liest sich hier für die SSAS jetzt von der Menge her nicht sehr tragisch, kann einen Architekten bzw. Berater aber empfindlich eingrenzen und leicht zum Misserfolg eines Projektes führen!&lt;br /&gt;&lt;br /&gt;Und bei den &lt;strong&gt;Reporting Services&lt;/strong&gt; fehlt uns eigentlich “nur” das Feature “Datengesteuerte Berichtsabonnements”, aber auch das kann fehlen. Und immer daran denken, dass nachmachen nicht gilt! :-)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Master Data Services&lt;/strong&gt; und &lt;strong&gt;PowerPivot für SharePoint&lt;/strong&gt; haben wir nur ab der “Enterprise Edition”!&lt;br /&gt;&lt;br /&gt;Wie kann nun im Rahmen eines Proof-of-Concepts entschieden oder in den ersten Projekt Phasen eine belastbare Entscheidung herbeigeführt werden für die Auswahl einer Edition? Wie oben bereits gesehen, hängt die Auswahl der Edition stark von den Anforderungen ab! Daher ist es sehr wichtig den Anforderungskatalog für das geplante Projekt durchzugehen und zu klären, ob echte Showstopper dabei sind. Sofern sich die Projektbeteiligten nicht einig sind, ob die Features wirklich benötigt werden, empfehle ich einen Piloten auf Basis der kostenlosen “Evaluierung” Edition aufzusetzen. Diese Edition hat den Umfang der “Enterprise” Edition. &lt;br /&gt;&lt;br /&gt;Nun zur Wahl der Version. Wichtig der Hinweis, dass diese Entscheidung, wenn sie denn tatsächlich ansteht, vor der Wahl einer Edition erfolgen sollte.&lt;br /&gt;&lt;br /&gt;Hier ist der Rat sehr einfach. Eigentlich sollte immer auf die aktuell verfügbare Version zurückgegriffen werden. Wenn bereits eine Version vorhanden ist und keine Möglichkeiten bestehen im Rahmen des Lizenzvertrages mit Microsoft auf die aktuelle Version zu wechseln, also eine nicht kostenneutrale Entscheidung ansteht, dann empfehle ich wieder auf Basis des Anforderungskatalogs zu klären, welche neuen Features benötigt werden. &lt;br /&gt;&lt;br /&gt;Ein häufiger Grund für den Wechsel von 2008 auf 2008 R2 waren in der Vergangenheit u. a. die zahlreichen Erweiterungen der Reporting Services.&lt;br /&gt;&lt;br /&gt;Ein Hinweis noch zur sogenannten “Developer Edition”, da diese relativ unbekannt ist. Mit dieser dürfen Entwickler bzw. BI Berater auf Entwicklungssystemen bzw. lokalen Rechner isoliert von den produktiven Systemen an der Lösung arbeiten. Solche extra Server sind bei anderen Herstellern immer recht kostenintensiv, bei Microsoft hat sich über Jahre ein Preis von unter 100€ pro Lizenz gehalten. Das ist äußerst günstig und sollte in Projekten auf jeden Fall genutzt werden, da es zumindest keinen lizenztechnischen Grund gibt direkt auf dem produktiven Systemen die Lösung weiterzuentwickeln.&lt;br /&gt;&lt;br /&gt;Bei allen Angaben in diesem Post beziehe ich mich als Quelle auf diese Seite von Microsoft: &lt;a href="http://technet.microsoft.com/de-de/library/cc645993.aspx" title="http://technet.microsoft.com/de-de/library/cc645993.aspx"&gt;http://technet.microsoft.com/de-de/library/cc645993.aspx&lt;/a&gt;&lt;br /&gt;&lt;div class="wlWriterHeaderFooter" style="margin: 0px; padding: 4px 0px; text-align: right;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fsaschalorenz.blogspot.com%2f2011%2f06%2fsql-server-versionen-editionen-im.html&amp;amp;title=SQL+Server+Versionen+%26+Editionen+im+Vergleich+%e2%80%93+Entscheidung+vor+dem+BI+Projekt%3f"&gt;&lt;img alt="Digg This" border="0" height="20" src="http://digg.com/img/badges/100x20-digg-button.png" style="border: 0px currentColor;" title="Digg This" width="100" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4295606376610171719?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4295606376610171719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4295606376610171719'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/06/sql-server-versionen-editionen-im.html' title='SQL Server Versionen &amp;amp; Editionen im Vergleich – Entscheidung vor dem BI Projekt?'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6778340103412320871</id><published>2011-06-01T10:42:00.001+02:00</published><updated>2011-06-01T10:42:26.752+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='PSG'/><title type='text'>SharePoint Business Intelligence bei Microsoft in Unterschleißheim (ShareCamp)</title><content type='html'>&lt;p&gt;Nun ist das ShareCamp in Unterschleißheim ja schon ein paar Tage her. Hatte gleich danach viel um die Ohren. &lt;/p&gt;  &lt;p&gt;Unter anderem war ich gleich noch am folgenden Montag Abend in Köln im Microsoft Regional Office, um dort bei der &lt;a href="http://www.sqlpass.de"&gt;SQL Server Community (PASS Deutschland e.V.)&lt;/a&gt; einen Vortrag über Repository Driven BI zu halten. Vielen Dank an die Organisatoren und die vielen Teilnehmer, hat mir großen Spaß gemacht!&lt;/p&gt;  &lt;p&gt;Aber nun ist die Zeit gekommen für ein kurzes Resümee zum ShareCamp.&lt;/p&gt;  &lt;p&gt;Erst mal vielen herzlichen Dank an die Organisatoren aus der Community und von Microsoft! Das ShareCamp ist eine wirklich gelungene Community Veranstaltung gewesen! Selten war der Community Gedanke auf einer Konferenz so unmittelbar greifbar! Das lag sicherlich auch an der für mich neuen Veranstaltungsform als &lt;a href="http://de.wikipedia.org/wiki/BarCamp"&gt;Barcamp&lt;/a&gt;. War anders, aber hat viel Spaß gemacht, da das flexible Format gerade meiner persönlichen Nähe zur Spontanität zugesagt hat. :-)&lt;/p&gt;  &lt;p&gt;Ach ja, aus Tradition… Essen war gut &amp;amp; lecker! &lt;/p&gt;  &lt;p&gt;Aber ich war ja nicht allein auf dem ShareCamp. Wir, die &lt;a href="http://www.psg.de"&gt;PSG Projekt Service GmbH aus Hamburg&lt;/a&gt;, waren als Sponsor dabei. Und das wiederum auch nicht allein, denn gemeinsam mit der &lt;a href="http://www.layer2.de/"&gt;Layer 2 GmbH&lt;/a&gt; (auch aus Hamburg), haben wir einen norddeutschen Gemeinschaftsstand in Unterschleißheim aufgemacht. Genaugenommen hatten uns die Kollegen von der Layer 2 den Vorschlag dazu gemacht. U.a. hatten wir eine gemeinsame Demoumgebung für die Vorträge erstellt, welche auch von Layer 2 gehostet wurde. Vielen Dank für die super Zusammenarbeit im Vorfeld und Vorort an Gabriella, Björn, Carsten, Frank, Jörn &amp;amp; Matthias von Layer 2. Des Weiteren auch einen herzlichen Dank an meine Kollegen Jan, Michael (vor Ort) &amp;amp; Olaf-Christian für die Unterstützung der SharePoint Community! &lt;/p&gt;  &lt;p&gt;Vorträge wurden natürlich auch gehalten. Mein Thema war Business Intelligence im Kontext SharePoint Server bzw. Technologie. Der Inhalt wurde von vielen Teilnehmern interessiert aufgenommen. Spontan (ist ja ein Barcamp) haben wir dann vor Ort entschieden noch eine gemeinsame Session mit dem &lt;a href="https://www.xing.com/profile/Matthias_Hupe2"&gt;Matthias Hupe&lt;/a&gt; von Layer 2 durchzuführen, um einmal komplett sowohl die SQL Server Business Intelligence Seite (PerformancePoint Services, Analysis Services &amp;amp; Co) als auch in vergleichbarer Tiefe die notwendige SharePoint Infrastruktur zu erläutern.&lt;/p&gt;  &lt;p&gt;Das wiederum hat uns die Aufmerksamkeit von Microsoft, in Person &lt;a href="http://channel9.msdn.com/Niners/Lori"&gt;Lori Grosland&lt;/a&gt; (Community Developer Evangelist), eingebracht, welche uns dann noch zum Thema interviewt hat. Das Ergebnis steht mittlerweile im Netz! Einfach aufs Bild klicken oder auf den Link.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Hier klicken für das Video!" border="0" alt="Hier klicken für das Video!" src="http://lh6.ggpht.com/-3XGaNn39II0/TeX7b-QJsHI/AAAAAAAAAX4/uKifAhmcpEU/image%25255B6%25255D.png?imgmax=800" width="637" height="361" /&gt;&lt;/p&gt;  &lt;p align="center"&gt;Lori steht in der Mitte (ach…), rechts der Matthias und links bin ich.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="http://channel9.msdn.com/Blogs/Lori/ShareCamp-2011-Business-Intelligence--SharePoint" href="http://channel9.msdn.com/Blogs/Lori/ShareCamp-2011-Business-Intelligence--SharePoint"&gt;http://channel9.msdn.com/Blogs/Lori/ShareCamp-2011-Business-Intelligence--SharePoint&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Des Weiteren habe ich aus dem Event viele Anregungen mitgenommen. Und habe auch schon wieder eine ganze Reihe von Ideen, wie die Integration von Business Intelligence in SharePoint noch unterstützt werden kann. Was mich noch zu einem anderen Thema bringt und zwar bereite ich eifrig den Start der Community Website rund um die Entwicklersicht auf die &lt;a href="http://the-developer-site-of-microsoft-business-intelligence.de/"&gt;Microsoft Business Intelligence Komponenten von Microsoft&lt;/a&gt; vor. Unter anderem werde ich dort einige meiner Community Projekte aus meinen Vorträgen zusammenführen und um weitere Informationen erweitern. Der Wunsch nach Sourcecode und Beispielen für meine bzw. unsere Ansätze in Projekten wird immer lauter und lässt sich meiner Meinung nach wohl nicht nur über diesen Blog erfüllen. &lt;/p&gt;  &lt;p&gt;Und zu guter Letzt noch der Hinweis, dass bei mir gerade die Bestätigungen als Sprecher für weitere Konferenzen in 2011 eintrudeln, also die Wahrscheinlichkeit mich auf einem Community Event zu treffen ist weiterhin hoch. Details folgen, wenn die Inhalte offiziell freigeschaltet werden. :-)&lt;/p&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:right; margin:0px; padding:4px 0px 4px 0px;"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fsaschalorenz.blogspot.com%2f2011%2f06%2fsharepoint-business-intelligence-bei.html&amp;amp;title=SharePoint+Business+Intelligence+bei+Microsoft+in+Unterschlei%c3%9fheim+(ShareCamp)"&gt;&lt;img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border: 0" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6778340103412320871?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6778340103412320871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6778340103412320871'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/06/sharepoint-business-intelligence-bei.html' title='SharePoint Business Intelligence bei Microsoft in Unterschleißheim (ShareCamp)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-3XGaNn39II0/TeX7b-QJsHI/AAAAAAAAAX4/uKifAhmcpEU/s72-c/image%25255B6%25255D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-9187631025953066156</id><published>2011-05-13T23:09:00.001+02:00</published><updated>2011-05-13T23:09:36.989+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>ShareCamp, ich bin auf dem Weg – Business Intelligence mit SharePoint</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/05/sharecamp-ich-bin-auf-dem-weg-business.html";digg_title = "ShareCamp, ich bin auf dem Weg – Business Intelligence mit SharePoint";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Langsam nähere ich mich Unterschleißheim. Dort ist ja am kommenden Wochenende das &lt;a href="http://www.sharecamp.de/" target="_blank"&gt;ShareCamp&lt;/a&gt; im HQ von Microsoft Deutschland.&lt;/p&gt;  &lt;p&gt;Nachdem ich vorgestern ja noch beim &lt;a href="http://www.sqlpass.de" target="_blank"&gt;PASS&lt;/a&gt; (SQL Server Usergroup) Treffen in Hamburg dabei war,&amp;#160; habe ich noch kurz Station gemacht in der PASS Regionalgruppe Hannover und dort einen Vortrag über “The Developer Side of Microsoft BI” gehalten. Hat großen Spaß gemacht! Sehr interessante Diskussionen. Besonders mit den drei Regionalgruppenverantwortlichen vor Ort: Christoph Seck, Artus Krohn-Grimberghe &amp;amp; Vladimir Stepa. Gerade die Diskussionen mit Vladimir, einem der Mitentwickler des berühmten MDX Studios, waren anspruchsvoll aber sehr auch inspirierend!&lt;/p&gt;  &lt;p&gt;Danke, dass ich dabei sein durfte! Ich hoffe, dass für alle ein paar Anregungen dabei waren!&lt;/p&gt;  &lt;p&gt;Heute geht die Fahrt weiter nach München.&lt;/p&gt;  &lt;p&gt;Auf dem ShareCamp gibst dann von mir Einiges zum Thema BI mit dem SharePoint Server.&lt;/p&gt;  &lt;p&gt;Auf Rückweg können wir uns dann noch in Köln am Montag Abend beim PASS Treffen im Microsoft RO begegnen. Da halte ich dann ja auch noch einen Vortrag.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ps:Sorry für die Verspätung des Posts, Blogger war teilweise down.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-9187631025953066156?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/9187631025953066156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/9187631025953066156'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/05/sharecamp-ich-bin-auf-dem-weg-business.html' title='ShareCamp, ich bin auf dem Weg – Business Intelligence mit SharePoint'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-2243897378544948564</id><published>2011-05-07T12:16:00.001+02:00</published><updated>2011-05-07T12:16:53.391+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SSIS (Integration Services) als ETL Lösung – Dynamisches SSIS? [Coaches’ Hell]</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/05/ssis-integration-services-als-etl.html";digg_title = "SSIS (Integration Services) als ETL Lösung – Dynamisches SSIS? [Coaches’ Hell]";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Eine häufige Frage an mich ist, warum ich überhaupt so viel Zeit investiere in die Entwicklung von &lt;a href="http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl_27.html" target="_blank"&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 “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.&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="http://lh4.ggpht.com/_1gJtalph07w/TcUb7O46ixI/AAAAAAAAAW0/qbYkjpJJKLs/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TcUb7qI5loI/AAAAAAAAAW4/nbRdtp3kRcM/image_thumb%5B2%5D.png?imgmax=800" width="424" height="123" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;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. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TcUb8N2EUqI/AAAAAAAAAW8/BziUFzDbQOM/s1600-h/image%5B10%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TcUb8Q03wtI/AAAAAAAAAXA/37PizLQGCXo/image_thumb%5B6%5D.png?imgmax=800" width="369" height="357" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;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.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TcUb80HBqWI/AAAAAAAAAXE/MaNvxhGUbug/s1600-h/image%5B16%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TcUb_jlObZI/AAAAAAAAAXI/2eU4YmOQ95w/image_thumb%5B10%5D.png?imgmax=800" width="546" height="532" /&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 “auch” 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="http://lh4.ggpht.com/_1gJtalph07w/TcUcA6xXMtI/AAAAAAAAAXM/PKF1tynzE6o/s1600-h/image%5B26%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TcUcBan13CI/AAAAAAAAAXQ/tUX6Li8TcOA/image_thumb%5B16%5D.png?imgmax=800" width="642" height="280" /&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="http://lh3.ggpht.com/_1gJtalph07w/TcUcBm2jzmI/AAAAAAAAAXU/vHVqL6m4q4o/s1600-h/image%5B32%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TcUcBygRavI/AAAAAAAAAXY/cgsEoJGz2a4/image_thumb%5B20%5D.png?imgmax=800" width="317" height="293" /&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="http://saschalorenz.blogspot.com/2011/04/integration-services-reporting-services.html" target="_blank"&gt;RDLInput&lt;/a&gt; liegen, nehmen wir einfach die.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TcUcCKCJD9I/AAAAAAAAAXc/2obIwth1efM/s1600-h/image%5B37%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TcUcCu9dQaI/AAAAAAAAAXg/92Q13a96cxQ/image_thumb%5B23%5D.png?imgmax=800" width="528" height="142" /&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="http://lh5.ggpht.com/_1gJtalph07w/TcUcC7kUCLI/AAAAAAAAAXk/Z3kLn_XDHPQ/s1600-h/image%5B42%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/TcUcDs3fsoI/AAAAAAAAAXo/XTYtAR0Kaaw/image_thumb%5B26%5D.png?imgmax=800" width="502" height="216" /&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 “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.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TcUcEH-GrqI/AAAAAAAAAXs/3HMuxnuJlXk/s1600-h/image%5B49%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TcUcEvsKlqI/AAAAAAAAAXw/cNazZ1_3Pok/image_thumb%5B31%5D.png?imgmax=800" width="648" height="283" /&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;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-2243897378544948564?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2243897378544948564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2243897378544948564'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/05/ssis-integration-services-als-etl.html' title='SSIS (Integration Services) als ETL Lösung – Dynamisches SSIS? [Coaches’ Hell]'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1gJtalph07w/TcUb7qI5loI/AAAAAAAAAW4/nbRdtp3kRcM/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-7916797018228970257</id><published>2011-05-05T18:58:00.001+02:00</published><updated>2011-05-05T18:58:22.321+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>PASS, PASS, ShareCamp &amp; PASS – Meine nächste Woche</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/05/pass-pass-sharecamp-pass-meine-nachste.html";digg_title = "PASS, PASS, ShareCamp &amp; PASS – Meine nächste Woche";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;So, jetzt ist es amtlich! Meine nächste Woche wird ein “wenig” Community-lastig…&lt;/p&gt;  &lt;p&gt;Mittwoch, den 11.5., &lt;a href="http://www.sqlpass.de/Regionen/Deutschland/Hamburg/tabid/78/Default.aspx" target="_blank"&gt;PASS Treffen Hamburg&lt;/a&gt; zum Thema “Denali” (da bin ich nur Co-Sprecher…) –&amp;gt; Dank an Markus Thomanek von Microsoft!&lt;/p&gt;  &lt;p&gt;Donnerstag, den 12.5., &lt;a href="http://www.sqlpass.de/Regionen/Deutschland/HannoverG%C3%B6ttingen/tabid/79/Default.aspx" target="_blank"&gt;PASS Treffen Hannover&lt;/a&gt; zum Thema “Developer Side of Microsoft BI” (mit mir als Sprecher)&lt;/p&gt;  &lt;p&gt;Freitag, den 13.5., bis zum Sonntag, den 15.5., bin ich dann als Sponsor (&amp;amp; als Sprecher) auf dem &lt;a href="http://saschalorenz.blogspot.com/2011/04/sharecamp-2011-in-munchen.html" target="_blank"&gt;ShareCamp 2011&lt;/a&gt; in Unterschleißheim, München dabei&lt;/p&gt;  &lt;p&gt;und weil es so schön in der Community ist…&lt;/p&gt;  &lt;p&gt;Montag, den 14.5., &lt;a href="http://www.sqlpass.de/Regionen/Deutschland/K%C3%B6lnBonnD%C3%BCsseldorf/tabid/81/Default.aspx" target="_blank"&gt;PASS Treffen Köln&lt;/a&gt; zum Thema “Developer Side of Microsoft BI” (wieder mit mir als Sprecher).&lt;/p&gt;  &lt;p&gt;Sehen wir uns? Bei der Tour gibt es fast keine Ausrede mehr! :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-7916797018228970257?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7916797018228970257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7916797018228970257'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/05/pass-pass-sharecamp-pass-meine-nachste.html' title='PASS, PASS, ShareCamp &amp;amp; PASS – Meine nächste Woche'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-1424404482937518469</id><published>2011-05-04T22:15:00.001+02:00</published><updated>2011-05-04T22:15:18.596+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SSIS (Integration Services) – ETL vs. ELT Lösung?</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/05/ssis-integration-services-etl-vs-elt.html";digg_title = "SSIS (Integration Services) – ETL vs. ELT Lösung?";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Und wieder war es ein Meeting, welches mich zu einen Blogpost animiert.&lt;/p&gt;  &lt;p&gt;Wir sprachen über die Einführung eines Data Warehouses, ETL etc. pp. und dann kam da einer mit einer ganz tollen Frage: Was ist denn mit ELT und wo sei der Unterschied? Und ob das denn die Integration Services auch könnten? Ist doch die Zukunft des Integrationsprozesses, sagt doch der andere Hersteller. Also wäre ja zu erwarten, dass Microsoft solche Innovationen unterstützt. Der klassische ETL Prozess wäre ja quasi von gestern und mit ELT dann ja auch dazu noch überflüssig geworden.&lt;/p&gt;  &lt;p&gt;Erwartungsvolle Gesichter in der Runde. Was ist denn nun ELT und kann das der SQL Server? Ich liebe meinen Job… &lt;/p&gt;  &lt;p&gt;Also, &lt;a href="http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl.html" target="_blank"&gt;klassisches ETL (Extract, Transform, Load)&lt;/a&gt; meint, stark vereinfacht ausgedrückt, dass Daten aus verschiedenen Vorsystemen extrahiert werden. Diese werden in der Regel in Form von “Datenpaketen” in einer sogenannten &lt;a href="http://saschalorenz.blogspot.com/2011/03/landing-area-zone-im-sql-server-data.html" target="_blank"&gt;Landing Zone&lt;/a&gt; gesammelt. Von dort aus werden die Pakete i. d. Regel mehrstufig weiterverarbeitet, sprich transformiert. Der letzte Schritt ist das Laden der Daten in das relationale Data Warehouse, wobei dann noch die Historisierung von Daten durchgeführt werden kann.&amp;#160; &lt;/p&gt;  &lt;p&gt;Was kann nun eine ELT Lösung dazu Innovatives beitragen? Das Offensichtliche zuerst. ELT steht für Extract, Load &amp;amp; Transform. Ok, ist halt vertauscht. Und? :-)&lt;/p&gt;  &lt;p&gt;Die Idee dabei ist, dass Daten wiederum zuerst aus Vorsystemen extrahiert werden. Die Methoden, Konzepte, Ideen und auch Herausforderungen sind 100% identisch zur ETL Welt. Auch können diese Daten in Form von Datenpaketen organisiert werden. Nur dann kommt der wesentliche Unterschied! Die Daten werden beim ELT Ansatz gleich wieder in ein relationales Datenbanken System geladen. Häufig ist es das System, welches auch das eigentliche Data Warehouse hält. Und auf diesem System werden die Daten mittels SQL Statements transformiert. Das ist schon alles. &lt;/p&gt;  &lt;p&gt;Ok, ok… wozu jetzt die ganze Aufregung? Dazu müssen wir noch ein wenig mehr ins Detail gehen beim ETL Prozess. Beim ETL findet häufig eine Verarbeitung der Daten außerhalb einer relationalen Datenbank statt. In der Regel werden die Daten zeilenweise verarbeitet. In den Integration Services wird das durch den konsequenten Einsatz der Datenflusskomponente und des RAW-Dateiformates erreicht. Ab einer sehr großen Datenmenge ist dieses Vorgehen deutlich schneller als die relationale Engine zu bemühen. &lt;/p&gt;  &lt;p&gt;Bei ELT gibt es aber keine extra Verarbeitungsengine, sondern “alles” findet innerhalb einer relationalen Datenbank statt. Es wird damit eine Technologie “gespart”. Das ist der häufig ins Feld geführte Vorteil einer ELT Architektur. In der Praxis heißt das auch oft, dass ein extra System gespart wird.&lt;/p&gt;  &lt;p&gt;Meine 2 Cent dazu sind:    &lt;br /&gt;ELT klingt gut, kann es sogar sein, ja wenn… die Rahmenbedingungen stimmen! Wenn ich keine wirklich komplexe und unübersichtliche Umgebung habe. Des Weiteren sollte die Anzahl der Vorsysteme überschaubar sein. Und, steht ja schon oben, die Datenmenge sollte auch gewisse Grenzen haben (und nein, da gibt es keine one-size-fits-all Antwort drauf!).&lt;/p&gt;  &lt;p&gt;Die Wahrheit ist, dass es da draußen eine Unmenge an ETL Prozessen gibt, welche sehr wahrscheinlich ELT Prozesse sind. Und bisher hat es keinen gestört! :-) &lt;/p&gt;  &lt;p&gt;Ach ja, und natürlich lassen sich auch ELT Integrationsprozesse mit dem Microsoft SQL Server abbilden. Alles eine Frage der Architektur!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-1424404482937518469?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1424404482937518469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1424404482937518469'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/05/ssis-integration-services-etl-vs-elt.html' title='SSIS (Integration Services) – ETL vs. ELT Lösung?'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-812308829410847438</id><published>2011-05-01T12:06:00.001+02:00</published><updated>2011-05-01T12:09:06.634+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server Reporting Services (SSRS) – Wofür können diese eigentlich alles genutzt werden?</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/05/sql-server-reporting-services-ssrs.html";digg_title = "SQL Server Reporting Services (SSRS) – Wofür können diese eigentlich alles genutzt werden?";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&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 “Zeigen Sie mal, was das kann…” 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 “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.&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 “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.&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 “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.&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 “pflegen” können (Self-Service Schnittstelle)     &lt;br /&gt;&lt;/strong&gt;Die Reporting Services können ja nicht “nur” 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 “Berichtsserver”. 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;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-812308829410847438?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/812308829410847438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/812308829410847438'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/05/sql-server-reporting-services-ssrs.html' title='SQL Server Reporting Services (SSRS) – Wofür können diese eigentlich alles genutzt werden?'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-5203630130828061273</id><published>2011-04-30T13:51:00.001+02:00</published><updated>2011-04-30T13:51:43.616+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SSIS (Integration Services) als ETL Lösung – Package Tools im Eigenbau – Teil 2 – Connection Manager auslesen</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl_30.html";digg_title = "SSIS (Integration Services) als ETL Lösung – Package Tools im Eigenbau – Teil 2 – Connection Manager auslesen";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Hier ist der nächste Teil meiner kleinen Reihe über die Entwicklung von eigenen Werkzeugen für das Auslesen und Verändern von SSIS Paketen (dtsx).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl_27.html" target="_blank"&gt;Wie bereits im ersten Teil, machen wir noch was ganz harmloses&lt;/a&gt; und lesen dieses Mal die Verbindungsmanager eines Paketes aus. Das Codebeispiel dient für den Moment hauptsächlich dazu, zu zeigen wie einfach der Zugriff auf einzelne Eigenschaften eines SSIS Paketes ist. Des Weiteren demonstriere ich noch, wie wir bereits hier auf die Verwendung von Expressions prüfen können. Expressions, also die Arbeit mit dynamischen Ausdrücken innerhalb einer SSIS Lösung, lassen äußerst mächtige Architekturen möglich werden, sind aber in der späteren Wartung ein wenig tricky, wenn der Verantwortliche für den Betrieb der Lösung nicht immer hundertprozentig weiß, wofür gerade überall Ausdrücke verwendet werden. Gerade im Zusammenspiel mit mehrstufigen Paket-Konfigurationen kann die Fehlersuche durchaus anspruchsvoll werden. Aber deswegen bauen wir uns ja einen eigenen Satz Werkzeuge, um später den Überblick zu behalten. &lt;/p&gt;  &lt;p&gt;Hier das entsprechende Codefragment, welches wieder ein Paket öffnet und alle Verbindungen ausliest. Und über &lt;em&gt;&lt;strong&gt;GetExpression&lt;/strong&gt;&lt;/em&gt; wird auf die Verwendung der Eigenschaft &lt;em&gt;&lt;strong&gt;ConnectionString&lt;/strong&gt;&lt;/em&gt; geprüft.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;app = new Microsoft.SqlServer.Dts.Runtime.Application(); &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;DialogResult result = openFileDialog1.ShowDialog();     &lt;br /&gt;if (result == DialogResult.OK)      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; p = app.LoadPackage(openFileDialog1.FileName, null); // Hier haben wir unser Paket in 'p' &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; foreach (&lt;strong&gt;ConnectionManager ConMan in p.Connections&lt;/strong&gt;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listBox1.Items.Add(ConMan.CreationName + &amp;quot; - &amp;quot; + ConMan.ConnectionString); &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String ExConString = &lt;strong&gt;ConMan.GetExpression(&amp;quot;ConnectionString&amp;quot;);&lt;/strong&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (ExConString != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listBox1.Items.Add(&amp;quot;ConnectionString Expression -&amp;gt; &amp;quot;+ExConString); &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;}&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-5203630130828061273?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5203630130828061273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5203630130828061273'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl_30.html' title='SSIS (Integration Services) als ETL Lösung – Package Tools im Eigenbau – Teil 2 – Connection Manager auslesen'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-2684619553764038218</id><published>2011-04-28T16:03:00.001+02:00</published><updated>2011-04-28T16:03:09.153+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Projektmanagement'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Einsteiger'/><title type='text'>SSAS (Analysis Services) OLAP Cubes – Der Stern ist nicht der Würfel!</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/ssas-analysis-services-olap-cubes-der.html";digg_title = "SSAS (Analysis Services) OLAP Cubes – Der Stern ist nicht der Würfel!";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Das Geschäft als Berater bzw. als Coach besteht ja auch zum Teil daraus, dass man zur richtigen Zeit den richtigen Spruch bzw. Lehrsatz auf den Lippen hat.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“Der Stern, die Schneeflocke oder die Galaxie ist nicht gleichzusetzen mit dem daraus entstehenden multidimensionalem Raum!”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Kurzfassung:&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;Der Stern ist nicht der Würfel!&lt;/strong&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://saschalorenz.blogspot.com/2011/02/coaches-hell-wie-entwickle-ich-denn.html" target="_blank"&gt;Viele Anwender der Analysis Services arbeiten aber gerne mit der Vorstellung&lt;/a&gt;, dass das Starschema nicht nur die Quelle darstellt, sondern auch, dass im Cube die Trennung zwischen Dimensionen und Fakten existiert. Dimensions- und Faktentabellen sind aber “nur” relationale Strukturen, welche als Datenquellen für den Würfel dienen. Viele Frontends, wie auch Excel, unterscheiden aber sehr deutlich in der Darstellung zwischen Attributen (Dimensionen) und Measures. Der eigentliche Cube bzw. der, wie ich finde korrektere Ausdruck, multidimensionale Raum haben aber ihre ganz eigene “Logik”. &lt;/p&gt;  &lt;p&gt;Wie kommen wir da jetzt raus? &lt;/p&gt;  &lt;p&gt;Muss nun jeder Endanwender eine hochesoterische MDX Schulung erhalten? Bitte nicht! Das führt nicht gerade zur Akzeptanz einer Lösung!&lt;/p&gt;  &lt;p&gt;Aber jeder, der sich für das Erstellen von OLAP Cubes mit den SQL Server Analysis Services interessiert, sollte frühzeitig in den “echten” multidimensionalen Raum einsteigen. Selbst wenn nie geplant ist mit MDX Berechnungen etc. pp. einzubauen, so ist das bloße Beschäftigen damit und Hinterfragen schon sehr nützlich, um auch die “einfachen” Funktionen von SSAS noch besser zu nutzen. Ehrlich!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-2684619553764038218?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2684619553764038218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2684619553764038218'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/ssas-analysis-services-olap-cubes-der.html' title='SSAS (Analysis Services) OLAP Cubes – Der Stern ist nicht der Würfel!'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-714621435434428432</id><published>2011-04-27T21:54:00.001+02:00</published><updated>2011-04-27T21:54:47.492+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SSIS (Integration Services) als ETL Lösung – Package Tools im Eigenbau – Teil 1</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl_27.html";digg_title = "SSIS (Integration Services) als ETL Lösung – Package Tools im Eigenbau – Teil 1";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;In der Vergangenheit habe ich ja schon mehrmals auf die Möglichkeiten der “Developer Side of Microsoft Business Intelligence” hingewiesen. Häufig habe ich dabei auch die Erstellung bzw. Modifikation von SSIS Paketen durch .NET Code gestresst. &lt;/p&gt;  &lt;p&gt;Ein Missverständnis dabei ist, dass ich diese Methode ausschließlich für die automatisierte Erstellung von SSIS Paketen (dtsx) empfehle! Der Aufwand, der dafür getrieben werden muss, um eine solche Lösung einzusetzen, ist tatsächlich sehr hoch und ist bei weitem nicht was für jedes Projekt. &lt;/p&gt;  &lt;p&gt;Aber, meine Empfehlung ist die “Developer Side” auch für bestehende Lösungen zu nutzen. U. a. für die automatisierte Inventarisierung und Erweiterung von SSIS Paketen, um zum Beispiel Logging und Debug Funktionen. Dieser Ansatz ist gerade für Lösungen interessant, bei denen am Anfang auf die konsequente Verwendung von Templates aus einem Framework verzichtet wurde. Für diesen Verzicht kann es diverse Gründe geben. Häufig ist, dass einfach keine Zeit war und der Kunde möglichst schnell Resultate sehen wollte. Später dann alle Pakete manuell umzustellen wird dann auch wieder oft vermieden, weil der Aufwand auch dann wieder immens sein kann.&lt;/p&gt;  &lt;p&gt;Daher habe ich mich entschlossen eine kleine Reihe von Artikeln zu veröffentlichen, um die Möglichkeiten der “Developer Side” für SSIS aufzuzeigen. Die Reihe startet mit diesen wenigen Zeilen Code, welche ein bestehendes SSIS Paket quasi per Knopfdruck um einen SQL Task inkl. Connection erweitern, um ein T-SQL Statement abzufeuern beim Start des Paketes. Das ist noch ein sehr einfaches Beispiel, aber zeigt schon erste wichtige Strukturen. Wir öffnen ein bestehendes Paket, modifizieren es und speichern es wieder.&lt;/p&gt;  &lt;p&gt;Dieses Beispiel werde ich dann in den nächsten Wochen weiter verfeinern. Viel Spaß beim Mitmachen!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/Tbh0fcQrIDI/AAAAAAAAAWs/z-MFLzKSPOc/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/Tbh0g6W3XRI/AAAAAAAAAWw/5XvKk0gF1dQ/image_thumb%5B3%5D.png?imgmax=800" width="408" height="312" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;using Microsoft.SqlServer.Dts.Runtime;     &lt;br /&gt;using Microsoft.SqlServer.Dts.Pipeline.Wrapper;      &lt;br /&gt;using wrap = Microsoft.SqlServer.Dts.Runtime.Wrapper;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Microsoft.SqlServer.Dts.Runtime.Application app;     &lt;br /&gt;Package p;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;private void bAuswahl_Click(object sender, EventArgs e)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; app = new Microsoft.SqlServer.Dts.Runtime.Application(); &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; DialogResult result = openFileDialog1.ShowDialog();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (result == DialogResult.OK)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; p = app.LoadPackage(openFileDialog1.FileName, null); &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ConnectionManager ConnManager = p.Connections.Add(&amp;quot;OLEDB&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ConnManager.Name = &amp;quot;Source&amp;quot;+tbDescription.Text;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ConnManager.ConnectionString = tbConnString.Text; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TaskHost th = p.Executables.Add(&amp;quot;STOCK:SQLTask&amp;quot;) as TaskHost;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; th.Name = tbDescription.Text;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; th.Description = tbDescription.Text; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; th.Properties[&amp;quot;SqlStatementSource&amp;quot;].SetValue(th, tbSQL.Text);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; th.Properties[&amp;quot;Connection&amp;quot;].SetValue(th, &amp;quot;Source&amp;quot; + tbDescription.Text); &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; app.SaveToXml(openFileDialog1.FileName, p, null);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-714621435434428432?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/714621435434428432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/714621435434428432'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl_27.html' title='SSIS (Integration Services) als ETL Lösung – Package Tools im Eigenbau – Teil 1'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/Tbh0g6W3XRI/AAAAAAAAAWw/5XvKk0gF1dQ/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-1211797751383686888</id><published>2011-04-25T21:56:00.001+02:00</published><updated>2011-04-25T21:56:39.923+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Projektmanagement'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SSIS (Integration Services) als ETL Lösung – Entscheidungen vor dem Einsatz</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl.html";digg_title = "SSIS (Integration Services) als ETL Lösung – Entscheidungen vor dem Einsatz";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Heute mal wieder ein paar Gedanken zur Architektur einer ETL Lösung. Genaugenommen sind wir bei der Klärung von einigen grundlegenden Fragestellungen. Welche können das beim Einsatz von Integration Services (SSIS) als ETL Lösung sein?&lt;/p&gt;  &lt;p&gt;Viele Fragestellungen bzw. Herausforderungen, welche ich im Rahmen von Coachings gestellt bekommen habe bzw. wir als Team in Projekten angetroffen haben, lassen sich auf einige grundlegende Missverständnisse und inkonsequente Entscheidungen zurückführen. Dabei geht es nicht um technische Details.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ist tatsachlich die Entscheidung für eine echte ETL Lösung getroffen worden?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;ETL heißt nicht, dass ein bestimmtes Tool verwendet wird! Also, wir verwenden die Integration Services heißt nicht automatisch, dass man da von ETL sprechen kann oder sollte. ETL ist für mich die konsequente Verfolgung eines Konzeptes. Und es heißt viel mehr als nur in Extract, Transform und Load zu denken, denn das trifft auch auf die meisten üblichen Schnittstellen zu. &lt;/p&gt;  &lt;p&gt;ETL heißt u. a., dass alle Beteiligen sehr wahrscheinlich in Zukunft in Datenpaketen denken müssen. Und damit ist nicht gemeint, dass SSIS Task in Paketen organisiert werden, sondern “wieder” klassische Batchverarbeitung von Datensätzen angesagt ist. Aber nur mit diesen einfachen aber effektiven Methoden können Datenmengen in Enterprise Umgebungen auch nachhaltig bewältigt werden.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ist jemand im Team, der schon mal ein echtes Data Warehouse gesehen hat?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ok, provokant, aber leider eine berechtigte Frage! Denn mit Integration Services zu arbeiten heißt nicht, dass man später nur noch mit bunten Pfeilen Kästchen verbinden darf und alles andere ist dann von ganz allein im Lot. Viel zu häufig erlebe ich, dass die SSIS unterschätzt werden. Das grundlegende Konzept ist ja auch sehr einfach. Da kommt dann gerne mal im Workshop oder Proof-of-Concept viel zu schnell ein “Schnittstelle, verstanden, lassen Sie uns jetzt bitte mit diesen Würfeln weitermachen…”. Daher, da muss jemand ins Team, der das Ziel kennt.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ist eine Entscheidung für den Einsatz des Datenflusstasks getroffen worden?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Was soll das denn jetzt? Der Datenflusstask ist doch das Herz der Integration Services! Korrekt, aber ich kenne einige sehr erfolgreiche und durchaus komplexe BI Projekte, welche komplett auf den Datenfluss Task verzichtet haben. Warum? Ja, weil einfach die Anforderung für den Einsatz fehlte. Zwar wurde der Bewirtschaftungsprozess komplett in SSIS gekapselt, aber es wurden konsequent SQL Statements für die Verarbeitung der Daten eingesetzt.&lt;/p&gt;  &lt;p&gt;Den Datenflusstask einzusetzen heißt, dass sich das Team bewusst dazu entscheidet ab sofort neben einem “Thinking in Sets” (ja, ich meine damit auch &lt;a href="http://www.amazon.com/Joe-Celkos-Thinking-Sets-Management/dp/0123741378" target="_blank"&gt;das Buch von Joe Celko&lt;/a&gt;) mit der Prämisse “Thinking in Rows” zu leben. Den Datenflusstask einzusetzen heißt auch eine nicht unerhebliche Lernkurve mitzumachen.&amp;#160; Dann hat das Team eine äußerst leistungsfähige Technologie zur Hand, um wirkliche Massendaten bei jedem Lauf des Prozesses zu bewegen. Wenn es aber wie so häufig um wenige 100.000 Sätze pro Tag geht, dann sollte vorher entschieden werden, ob sich der Aufwand beim Einsatz lohnt. Wichtig ist mir hier der Hinweis, dass es da kein Richtig oder Falsch gibt! Es gilt immer die Fallentscheidung.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Sind die politischen Aspekte eines solchen Projektes klar?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Natürlich ist jedes Projekt irgendwie politisch. Wer kennt das Spiel um die Förmchen und Schäufelchen nicht aus eigener Erfahrung. ETL Projekte, also wenn wir von einem echten sprechen (s.o.), sind anders, denn hier nehmen wir allen den Sand aus dem Sandkasten weg, um ihn erst mal richtig gut durchzuwaschen, zu sieben und dann färben wir den Sand auch der Größe der Körner nach ein. Und dann wird auch noch entschieden wer ab sofort mit dem blauen, roten und grünen Sand spielen darf. Vielleicht werden im Zuge des Projektes auch noch die liebgewonnen Eimer und Siebe standardisiert. Mit diesem Bild vor Augen sollte jedem die Situation und Herausforderung klar sein, in die er sich da begibt. Mein Ratschlag: Nehmen wir viele Lollies mit, welche dann vom Business Intelligence Competence Center verteilt werden sollten. Nicht ohne Grund ist die Gründung eines BICC häufig ein Teil eines ETL/DWH Projektes, um den Anwendern das Ganze schmackhaft zu machen.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-1211797751383686888?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1211797751383686888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1211797751383686888'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/ssis-integration-services-als-etl.html' title='SSIS (Integration Services) als ETL Lösung – Entscheidungen vor dem Einsatz'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6345383085316757942</id><published>2011-04-23T09:54:00.001+02:00</published><updated>2011-04-23T09:54:08.719+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Integration Services &amp; Reporting Services gemeinsam für die Bereitstellung von Reports nutzen</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/integration-services-reporting-services.html";digg_title = "Integration Services &amp; Reporting Services gemeinsam für die Bereitstellung von Reports nutzen";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Im Rahmen eines Projektes evaluiere ich gerade Möglichkeiten, um eine automatisierte Bereitstellung von Reports zu ermöglichen. Es geht dabei um 1-2 Reports mehr. :-)&lt;/p&gt;  &lt;p&gt;Die &lt;a href="http://saschalorenz.blogspot.com/2011/04/reporting-services-rsexe-mit-parametern.html" target="_blank"&gt;Verwendung von RS.EXE für die Ansteuerung der Reporting Services&lt;/a&gt; hatte ich in diesem Kontext ja schon beschrieben. Wobei mir bei RS.EXE die Anbindung von Datenquellen für die Parametrisierung nicht so gefällt.&lt;/p&gt;  &lt;p&gt;Daher heute ein weiterer Ansatz: &lt;strong&gt;Nutzung der Reporting Services aus den Integration Services heraus!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Von der Logik her unterscheidet sich der Weg zum Report gar nicht so sehr vom Skriptingansatz, da wir wieder mit den selben Objekten konfrontiert werden. Nur jetzt verwende ich mal den Webservice für die Kommunikation. &lt;/p&gt;  &lt;p&gt;Was brauchen wir also alles?&lt;/p&gt;  &lt;p&gt;Einen Report! Da nehme ich wieder mal meinen einfachen Report mit nur einem Parameter, um die Ansteuerung der Parameter zu testen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TbKFNPY454I/AAAAAAAAAV0/LFguSiIX-gk/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TbKFOY510eI/AAAAAAAAAV4/JIeX6MiBG7c/image_thumb%5B2%5D.png?imgmax=800" width="332" height="157" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Ein SSIS Paket, welches nur aus einem Datenflusstask besteht, welcher wiederum nur eine OLE-Quelle und ein Skriptkomponente hat, welche heute mal als Ziel herhalten muss.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TbKFPc-DsjI/AAAAAAAAAV8/_hEajnr9lKg/s1600-h/image%5B9%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TbKFQtYj0qI/AAAAAAAAAWA/gevuZNUa8KU/image_thumb%5B5%5D.png?imgmax=800" width="346" height="256" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Die Datenquelle hat ein vergleichsweises einfaches Design, aber wird ihren Job machen. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TbKFRVF3QcI/AAAAAAAAAWE/YI42jPm2KWg/s1600-h/image%5B14%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TbKFV02HtnI/AAAAAAAAAWI/KB-yfZLTqBw/image_thumb%5B8%5D.png?imgmax=800" width="326" height="193" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Die Eingabespalte für unsere Skriptkomponente ist einfach “Text”. Mehr Einstellungen braucht die Komponente auch nicht.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TbKFW2x_zAI/AAAAAAAAAWM/6_pLCb_30iM/s1600-h/image%5B19%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TbKFYLaPlZI/AAAAAAAAAWQ/HJogR3kM4a0/image_thumb%5B11%5D.png?imgmax=800" width="348" height="291" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Hier der Verweis auf den Webdienst der Reporting Services. Ab 2008 können wir ja auch Webdienste in der Komponente ansteuern. Danke nochmals dafür! :-)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TbKFY6w87qI/AAAAAAAAAWU/iDp8rlJsg18/s1600-h/image%5B25%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TbKFaj4IkrI/AAAAAAAAAWY/E8EHAgwX1D0/image_thumb%5B15%5D.png?imgmax=800" width="342" height="326" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Und natürlich noch das Stück Code für die Skriptkomponente. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;public override void Eingabe0_ProcessInputRow(Eingabe0Buffer Row)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; byte[] result = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string devInfo = @&amp;quot;&amp;lt;DeviceInfo&amp;gt;&amp;lt;Toolbar&amp;gt;False&amp;lt;/Toolbar&amp;gt;&amp;lt;/DeviceInfo&amp;gt;&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string encoding;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string mimeType;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string extension;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Warning[] warnings = null;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; string[] streamIDs = null; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; ParameterValue[] parameters = new ParameterValue[1];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; parameters[0] = new ParameterValue();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; parameters[0].Name = &amp;quot;DemoParameter&amp;quot;;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; parameters[0].Value = Row.Text; // &lt;strong&gt;Übergabe des Parameters von außen…&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; ReportExecutionService rs = new ReportExecutionService();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; rs.Credentials = System.Net.CredentialCache.DefaultCredentials; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; rs.LoadReport(&amp;quot;/Vertrieb/Demo&amp;quot;, null);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; rs.SetExecutionParameters(parameters, &amp;quot;de-de&amp;quot;); &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; result = rs.Render(&amp;quot;PDF&amp;quot;, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs); &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; FileStream stream = File.Create(@&amp;quot;c:\MyProjects\output\report_&amp;quot;+ Row.Text +&amp;quot;.pdf&amp;quot;, result.Length);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; stream.Write(result, 0, result.Length);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; stream.Close();      &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;So, diese Teile alle in einem SSIS Projekt bringt dann folgenden Output:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TbKFbb4j9wI/AAAAAAAAAWc/f06ncQPeXJc/s1600-h/image%5B30%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TbKFckbvjGI/AAAAAAAAAWg/nst-p4yCj5s/image_thumb%5B18%5D.png?imgmax=800" width="359" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; Und als Beweis kurz noch der Blick in eines der Dokumente.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TbKFmEN6-hI/AAAAAAAAAWk/KxaUx9OcqP0/s1600-h/image%5B35%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TbKFnINqaVI/AAAAAAAAAWo/f93ZbKAv-gU/image_thumb%5B21%5D.png?imgmax=800" width="360" height="111" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Damit bin ich jetzt schon eindeutig zufriedener, wenn es darum geht automatisiert eine größere Menge an Reports zu erzeugen. Der Ansatz scheint eine gute Grundlage zu sein.&lt;/p&gt;  &lt;p&gt;Viel Spaß beim Nachmachen! Und nochmals FROHE OSTERN! :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6345383085316757942?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6345383085316757942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6345383085316757942'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/integration-services-reporting-services.html' title='Integration Services &amp;amp; Reporting Services gemeinsam für die Bereitstellung von Reports nutzen'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1gJtalph07w/TbKFOY510eI/AAAAAAAAAV4/JIeX6MiBG7c/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-302631992863517156</id><published>2011-04-21T14:55:00.001+02:00</published><updated>2011-04-21T14:55:15.393+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Reporting Services RS.EXE mit Parametern nutzen</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/reporting-services-rsexe-mit-parametern.html";digg_title = "Reporting Services RS.EXE mit Parametern nutzen";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Vor ein paar Tagen habe ich hier gepostet wie Ihr mit dem Tool RS.exe (dem Reporting Services Skript Tool) einen Report bereitstellen könnt.&lt;/p&gt;  &lt;p&gt;Dazu kamen nun ein paar Fragen rein. Eine Frage wiederholte sich und zwar: &lt;strong&gt;Wie Parameter an den Report übergeben werden können?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Das ist natürlich möglich, dazu müssen wir nur das Skript ein wenig erweitern für. Dann könnt Ihr das gleich zu Ostern ausprobieren! :-)&lt;/p&gt;  &lt;p&gt;Zu erst aber brauchen wir einen Report mit einem Parameter. Dazu nehmen wir mal nichts komplexen, sondern diesen schönen Report. Der hat keinerlei Quellen etc., sondern nur einen Parameter mit dem schönen Namen “&lt;strong&gt;DemoParameter&lt;/strong&gt;”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TbApLvKQAmI/AAAAAAAAAVs/kBESAZVATp4/s1600-h/image5.png"&gt;&lt;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://lh4.ggpht.com/_1gJtalph07w/TbApMJdnrHI/AAAAAAAAAVw/-6ELVUjXFME/image_thumb3.png?imgmax=800" width="561" height="305" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Kommen wir zum Inhalt unseres “&lt;strong&gt;render.rss&lt;/strong&gt;” Skripts.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Public Sub Main()        &lt;br /&gt;&amp;#160; Dim fileName as String = &amp;quot;C:\Users\Administrator\Desktop\demo.png&amp;quot;         &lt;br /&gt;&amp;#160; Dim reportPath as String = &amp;quot;/Vertrieb/ParameterDemo&amp;quot;         &lt;br /&gt;&amp;#160; Dim results() as Byte &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160; Dim parameters(0) As ParameterValue &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160; parameters(0) = New ParameterValue()        &lt;br /&gt;&amp;#160; parameters(0).Name = &amp;quot;DemoParameter&amp;quot;         &lt;br /&gt;&amp;#160; parameters(0).Value = myText &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160; rs.Credentials = System.Net.CredentialCache.DefaultCredentials &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160; rs.LoadReport(reportPath, Nothing)        &lt;br /&gt;&amp;#160; rs.SetExecutionParameters(parameters,&amp;quot;en-us&amp;quot;)         &lt;br /&gt;&amp;#160; results = rs.Render(&amp;quot;IMAGE&amp;quot;,&amp;#160; Nothing, Nothing, Nothing, Nothing,&amp;#160; Nothing, Nothing)         &lt;br /&gt;&amp;#160; Dim stream&amp;#160; As FileStream = File.OpenWrite(fileName)         &lt;br /&gt;&amp;#160; stream.Write(results, 0, results.Length)         &lt;br /&gt;&amp;#160; stream.Close()         &lt;br /&gt;End Sub&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Hier sehen wir auch die Erweiterungen für die Arbeit mit Parametern. Wir nutzen ein Array vom Typ ParameterValue und übergeben dieses mittels “SetExecutionParameters()” an den Report. Nur kommt unser Parameter nun von außen in das Skript?&lt;/p&gt;  &lt;p&gt;Dazu hier unsere Kommandozeile:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;rs.exe –i render.rss –s http://localhost/ReportServer –e Exec2005 –v myText=”Hallo SQL Server Community…”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Mit dem Parameter “–v” legen wir eine globale Variable im Skript an, welche wir nutzen können. Siehe oben im Skript. Das war es schon!&lt;/p&gt;  &lt;p&gt;Frohe Ostern!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-302631992863517156?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/302631992863517156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/302631992863517156'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/reporting-services-rsexe-mit-parametern.html' title='Reporting Services RS.EXE mit Parametern nutzen'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1gJtalph07w/TbApMJdnrHI/AAAAAAAAAVw/-6ELVUjXFME/s72-c/image_thumb3.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-3275427242763160821</id><published>2011-04-21T10:21:00.001+02:00</published><updated>2011-04-21T10:21:07.847+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='PSG'/><title type='text'>ShareCamp 2011 in München, Unterschleißheim (Microsoft)</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/sharecamp-2011-in-munchen.html";digg_title = "ShareCamp 2011 in München, Unterschleißheim (Microsoft)";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Hier noch schnell vor Ostern der erste Hinweis, dass wir (die &lt;a href="http://www.psg.de" target="_blank"&gt;PSG&lt;/a&gt;) gemeinsam mit unserem Partner &lt;a href="http://www.layer2.de" target="_blank"&gt;Layer2&lt;/a&gt; auf dem &lt;a href="http://www.sharecamp.de" target="_blank"&gt;ShareCamp&lt;/a&gt;, dem Community Event für SharePoint in Deutschland, dabei sind.&lt;/p&gt;  &lt;p&gt;Das ShareCamp 2011 findet auch dieses Mal wieder in der Zentrale von Microsoft in Unterschleißheim statt. &lt;strong&gt;Termin ist der 14.-15.05.2011&lt;/strong&gt; (ja, das ist ein Wochenende!).&lt;/p&gt;  &lt;p&gt;Vor Ort werde u. a. ich sein und ein wenig die Business Intelligence Flagge für SharePoint hochhalten und die Integration von Analysis Services, Reporting Services etc. in SharePoint evangelisieren. Dazu gehört es natürlich auch, dass ich gerne die PerformancePoint Services erläutere und einen tiefen Einblick in die Technologie OLAP (so mit Dimensionen, Attributen, Tuples, MDX etc. pp.) gebe, um die PPS auch wirklich sinnvoll nutzen zu können.&lt;/p&gt;  &lt;p&gt;Ich freue mich schon sehr auf dieses Community Event! In den nächsten Tagen werde ich noch weitere Details dazu posten und was ihr von uns vor Ort sehen könnt.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-3275427242763160821?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3275427242763160821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3275427242763160821'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/sharecamp-2011-in-munchen.html' title='ShareCamp 2011 in München, Unterschleißheim (Microsoft)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6249113763138015970</id><published>2011-04-20T09:28:00.001+02:00</published><updated>2011-04-20T09:28:06.764+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server Community Vorträge in Hannover &amp; Köln</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/sql-server-community-vortrage-in.html";digg_title = "SQL Server Community Vorträge in Hannover &amp; Köln";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Wie die Zeit doch rennt! :-)&lt;/p&gt;  &lt;p&gt;Hier der Hinweis, dass ich als Gastsprecher am &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;12.05.2011&lt;/strong&gt; beim Treffen der &lt;a href="http://www.sqlpass.de/Regionen/Deutschland/HannoverG%C3%B6ttingen/tabid/79/Default.aspx" target="_blank"&gt;PASS Deutschland e.V. Gruppe Hannover / Göttingen&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;amp; am&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;16.05.2011&lt;/strong&gt; beim Treffen der &lt;a href="http://www.sqlpass.de/Regionen/Deutschland/K%C3%B6lnBonnD%C3%BCsseldorf/tabid/81/Default.aspx" target="_blank"&gt;PASS Deutschland e.V. Gruppe Köln / Bonn / Düsseldorf&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;bin!&lt;/p&gt;  &lt;p&gt;Ich werde bei beiden Treffen über eines meiner Lieblingsthemen sprechen dürfen und zwar &lt;/p&gt;  &lt;p&gt;“&lt;strong&gt;The Developer Side of Microsoft Business Intelligence&lt;/strong&gt;”    &lt;br /&gt;&lt;em&gt;Der Microsoft SQL Server bietet eine ganze Reihe von äußerst mächtigen Diensten und Werkzeugen für die Erstellung von Business Intelligence Lösungen. Warum sollte sich dann überhaupt ein BI Berater mit den Möglichkeiten der Programmierbarkeit des SQL Servers beschäftigen? Weicht er damit nicht vom Standard ab? Und warum sollte sich ein Programmierer mit BI befassen? Sind die BI relevanten Dienste vom SQL Server etwa nicht fertig?      &lt;br /&gt;      &lt;br /&gt;Die Wahrheit ist, dass eine wesentliche Stärke des SQL Servers, neben den bekannten Werkzeugen, die Verfügbarkeit von diversen sehr gut dokumentierten APIs ist. Diese APIs können sehr gut im Rahmen von BI Projekten genutzt werden und die Integrationsfähigkeit einer BI Lösung um ein vielfaches erhöhen. Alle in diesem Workshop vorgestellten Schnittstellen sind offiziell von Microsoft beschrieben worden und werden in zukünftigen Versionen unterstützt werden.       &lt;br /&gt;      &lt;br /&gt;Vor dem Einsatz von Technologie kommt aber immer die zielgerichtete Konzeption der Lösung. Es wird gezeigt, wann und wie sich der Einsatz von Programmierung in BI Projekten tatsächlich rechnet und welche Voraussetzungen dafür erfüllt sein müssen.      &lt;br /&gt;      &lt;br /&gt;Ein ganz wesentlicher Punkt aus der Erfahrung heraus ist die Nutzung der Abstraktion der Anforderungen und der Technologie als Architekturansatz im Design von Business Intelligence Lösungen.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Zwar geht der Vortrag bei einigen Punkten ein wenig ins Eingemachte, aber auch SQL Server BI Rookies werden eine Menge mitnehmen können. Versprochen!&lt;/p&gt;  &lt;p&gt;Ich freue mich schon sehr auf die Treffen und die Chance möglichst viele SQL Server Interessierte und Community-Begeisterte aus der jeweiligen Region kennenzulernen!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6249113763138015970?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6249113763138015970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6249113763138015970'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/sql-server-community-vortrage-in.html' title='SQL Server Community Vorträge in Hannover &amp;amp; Köln'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-156880920176865234</id><published>2011-04-19T16:06:00.001+02:00</published><updated>2011-04-19T16:06:38.344+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server Analysis Services &amp; Excel – “Bewegliche Ziele” oder wie wichtig ist eigentlich ein deterministischer Attribute Key?</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/sql-server-analysis-services-excel.html";digg_title = "SQL Server Analysis Services &amp; Excel – “Bewegliche Ziele” oder wie wichtig ist eigentlich ein deterministischer Attribute Key?";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Ein Thema kam beim letzten Treffen der SQL Server Community (PASS) in Hamburg auf und zwar die Frage: Wie wichtig ist die deterministische Vergabe des Attribute Keys in Analysis Services?”. Nun ja, und die Antwort darauf ist wie so oft: Kommt ganz drauf an!&lt;/p&gt;  &lt;p&gt;Was ist überhaupt gemeint mit der deterministische Vergabe von Attribute Keys?&lt;/p&gt;  &lt;p&gt;Am Beispiel von Excel 2010 als Frontend möchte ich kurz die Herausforderung skizzieren.&lt;/p&gt;  &lt;p&gt;In Excel 2010 können wir ohne weitere Plug-Ins mittels einer Pivot-Tabelle und/oder den &lt;a href="http://saschalorenz.blogspot.com/2010/05/cube-funktionen-in-excel-2007-2010.html"&gt;Excel Cube Funktionen&lt;/a&gt; auf Analysis Services Datenbanken (aka “Cubes”) zurückgreifen. Und Excel gibt es mittlerweile sowohl als Tool für den Desktop als auch als Excel Services im SharePoint.&lt;/p&gt;  &lt;p&gt;Für unser kleines Beispiel habe ich hier eine Tabelle &lt;strong&gt;&lt;em&gt;DimKunde&lt;/em&gt;&lt;/strong&gt; mit folgenden Einträgen:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/Ta2WvJyl_8I/AAAAAAAAAT0/bbrUJKhje_0/s1600-h/image66.png"&gt;&lt;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://lh4.ggpht.com/_1gJtalph07w/Ta2Wvgq0kpI/AAAAAAAAAT4/lZsO1BWOgrE/image_thumb36.png?imgmax=800" width="237" height="165" /&gt;&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;Wichtig dabei ist, dass die Dimensionszeile einen eindeutigen Schlüssel mit der Spalte &lt;em&gt;&lt;strong&gt;ID&lt;/strong&gt;&lt;/em&gt; hat&lt;em&gt;&lt;strong&gt;. &lt;/strong&gt;&lt;/em&gt;Die Spalte &lt;strong&gt;&lt;em&gt;OrtId&lt;/em&gt;&lt;/strong&gt; wird in diesem Fall automatisch erzeugt und enthält damit einen eindeutigen Key für jedes Member des Attributes. Das automatische Erzeugen machen wir zum Beispiel mit dem Ansatz aus meinem &lt;a href="http://saschalorenz.blogspot.com/2011/04/attribute-keys-fur-analysis-services.html"&gt;Blogpost über DENSE_RANK()&lt;/a&gt;. Die Vergabe der &lt;strong&gt;&lt;em&gt;OrtId&lt;/em&gt;&lt;/strong&gt; erfolgt immer direkt bei der Aufbereitung der Analysis Services Datenbank. Vielleicht ist da ja ein View oder ähnliches zwischengeschaltet.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/Ta2WwAvV9aI/AAAAAAAAAT8/hnw0bZjOc8I/s1600-h/image59.png"&gt;&lt;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://lh6.ggpht.com/_1gJtalph07w/Ta2WwqUW2lI/AAAAAAAAAUA/xLv1ioSNC9I/image_thumb31.png?imgmax=800" width="253" height="146" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wir setzen die “KeyColumns” Eigenschaft des Attributes in Analysis Services (also im BIDS) auf &lt;strong&gt;&lt;em&gt;OrtID&lt;/em&gt;&lt;/strong&gt; und die “NameColumn” auf &lt;strong&gt;&lt;em&gt;Ort.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/Ta2WxMKuofI/AAAAAAAAAUE/myTcAyyEvaw/s1600-h/image67.png"&gt;&lt;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://lh3.ggpht.com/_1gJtalph07w/Ta2Wxt0nR8I/AAAAAAAAAUI/LtOCw__NrWA/image_thumb37.png?imgmax=800" width="258" height="51" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Damit nun die Member nicht in der Reihenfolge der Schlüssel angezeigt werden, setzen wir noch die Eigenschaft “OrderBy&amp;quot; auf “Name”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/Ta2WxzGu9dI/AAAAAAAAAUM/AkR1YZQYphQ/s1600-h/image68.png"&gt;&lt;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://lh5.ggpht.com/_1gJtalph07w/Ta2WyRi-m8I/AAAAAAAAAUQ/1WwWGpQXZz8/image_thumb38.png?imgmax=800" width="301" height="44" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Und eine kleine Hierarchie darf auch nicht fehlen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/Ta2Wy5V-T5I/AAAAAAAAAUU/_hXB7QpK114/s1600-h/image72.png"&gt;&lt;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://lh6.ggpht.com/_1gJtalph07w/Ta2WzO3wkpI/AAAAAAAAAUY/8wYdr84c0m4/image_thumb40.png?imgmax=800" width="128" height="97" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Damit bekommen wir folgende Dimension:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/Ta2WzWadufI/AAAAAAAAAUc/Rmk5HGI5mgk/s1600-h/image73.png"&gt;&lt;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://lh6.ggpht.com/_1gJtalph07w/Ta2WzpO6rHI/AAAAAAAAAUg/Xd6e5_-hOTY/image_thumb41.png?imgmax=800" width="167" height="230" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Natürlich gibt es noch Fakten dazu, aber darauf gehen wir hier mal nicht im Detail ein. :-) &lt;/p&gt;  &lt;p&gt;Und schon können wir uns unsere multidimensionale Datenbank in Excel darstellen lassen. Nicht viel dran mit einer Dimension und einer Faktentabelle, aber es reicht für den Moment.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/Ta2W0GQSmkI/AAAAAAAAAUk/LV_GeXSzyo8/s1600-h/image74.png"&gt;&lt;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://lh3.ggpht.com/_1gJtalph07w/Ta2W0gRnGuI/AAAAAAAAAUo/a9efZxkvOBM/image_thumb42.png?imgmax=800" width="253" height="245" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nun filtern wir in Excel die Darstellung so, dass nur noch Umsätze für Hamburg angezeigt werden sollen:&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/Ta2W07MfJMI/AAAAAAAAAUs/XdTrGvoMIxc/s1600-h/image75.png"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;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://lh3.ggpht.com/_1gJtalph07w/Ta2W1SxA9rI/AAAAAAAAAUw/daFCZL7xM7s/image_thumb43.png?imgmax=800" width="224" height="361" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Noch schnell eine Überschrift drüber und schon ist ein einfacher “Report” fertig, wie er wahrscheinlich in etwas komplexerer Form in zahllosen Unternehmen tagtäglich erstellt wird. Den könnten wir nun gut abspeichern und später wieder nutzen, wir haben ja nun unsere Umsätze für Hamburg “herausgefiltert”. Nützlich so etwas und kann auch gerne dem Management zur Verfügung gestellt werden.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/Ta2W1jURagI/AAAAAAAAAU0/m7Lj7X2LSmM/s1600-h/image76.png"&gt;&lt;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://lh3.ggpht.com/_1gJtalph07w/Ta2W2POt05I/AAAAAAAAAU4/bkh36gfNtNc/image_thumb44.png?imgmax=800" width="257" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nun kommt der Tag, an wir einen weiteren Kunden dazu bekommen. Kein Problem, der bekommt ja sofort eine eindeutige ID zugeordnet. Aber, bei der täglichen Vergabe der &lt;em&gt;&lt;strong&gt;OrtId&lt;/strong&gt;&lt;/em&gt; ist nun auf einmal das Member “Essen” zwischen “Berlin” und “Hamburg” gerückt und bekommt damit die automatische &lt;em&gt;&lt;strong&gt;OrtId&lt;/strong&gt;&lt;/em&gt; “2”.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/Ta2W2Vs_rRI/AAAAAAAAAU8/ODFSVqsmu8Q/s1600-h/image77.png"&gt;&lt;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://lh4.ggpht.com/_1gJtalph07w/Ta2W3PayNXI/AAAAAAAAAVA/qnZG5f22_pM/image_thumb45.png?imgmax=800" width="236" height="157" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wenn wir uns nun die erweiterte Dimension anschauen, dann ist die korrekt ergänzt worden. Sieht alles unverdächtig aus!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/Ta2W3TDmLoI/AAAAAAAAAVE/KpfJAIpp5WA/s1600-h/image78.png"&gt;&lt;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://lh3.ggpht.com/_1gJtalph07w/Ta2W39aeqaI/AAAAAAAAAVI/YvjstffV5u4/image_thumb46.png?imgmax=800" width="153" height="256" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Aber wenn wir nun unser gespeichertes Excel Dokument anschauen und mittels &lt;strong&gt;&lt;em&gt;Aktualisieren&lt;/em&gt;&lt;/strong&gt; die Darstellung aktualisieren, dann haben wir auf einmal folgendes in unserem “Report” stehen:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/Ta2W4DrQrbI/AAAAAAAAAVM/0KbRvf-Dj6I/s1600-h/image79.png"&gt;&lt;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://lh6.ggpht.com/_1gJtalph07w/Ta2W4QBrJtI/AAAAAAAAAVQ/bNrzfF_Dubk/image_thumb47.png?imgmax=800" width="239" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Was ist denn jetzt passiert? Ganz offensichtlich speichert Excel den Key des Members ab. Und sobald wir aktualisieren, wird aus Hamburg Essen, da nun Essen die &lt;strong&gt;&lt;em&gt;OrtId&lt;/em&gt;&lt;/strong&gt; “2” hat. Ein solches Verhalten von auf Excel basierenden Reports wird sehr wahrscheinlich das Vertrauen der Endanwender in die Business Intelligence Lösung nicht unbedingt festigen!&lt;/p&gt;  &lt;p&gt;Wie schaust mit den Excel Cube Funktionen aus? Hierzu legen wir in Excel ein Beispielszenario an:&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;a href="http://lh5.ggpht.com/_1gJtalph07w/Ta2W41CEjkI/AAAAAAAAAVU/CkewACPt2OA/s1600-h/image80.png"&gt;&lt;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://lh3.ggpht.com/_1gJtalph07w/Ta2W5Lw1KKI/AAAAAAAAAVY/SGZa8zgiwDE/image_thumb48.png?imgmax=800" width="244" height="188" /&gt;&lt;/a&gt; Dieses kleine Beispiel basiert auf folgenden Formeln: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/Ta2W52qUcWI/AAAAAAAAAVc/4hZishI3GAA/s1600-h/image81.png"&gt;&lt;font color="#9e5205"&gt;&lt;/font&gt;&lt;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://lh3.ggpht.com/_1gJtalph07w/Ta2W6C-NfKI/AAAAAAAAAVg/RgNYwiuOgH4/image_thumb49.png?imgmax=800" width="556" height="165" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Der obere Wert verwendet den Key “&amp;amp;[2]”. Der untere Wert bezieht sich direkt auf den Namen des Members “Hamburg”. Nach der Erweiterung um unseren Kunden in Essen, sieht unser Excel Dokument nun so aus:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/Ta2W6sPQ-iI/AAAAAAAAAVk/84oR-8VYraI/s1600-h/image82.png"&gt;&lt;font color="#9e5205"&gt;&lt;/font&gt;&lt;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://lh5.ggpht.com/_1gJtalph07w/Ta2W6yZYNgI/AAAAAAAAAVo/OfWucZj1bUY/image_thumb50.png?imgmax=800" width="244" height="192" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Der obere Wert hat sich geändert auf den Wert von Essen, der untere ist erhalten geblieben. Wobei nun gesagt werden muss, dass die Funktion in C7 mit dem Standardverhalten von Excel erstellt wurde.&lt;/p&gt;  &lt;p&gt;Fragestellung ist nun: Wie kommen wir da jetzt nur raus?&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Es bleiben uns drei Varianten:&lt;/p&gt;  &lt;p&gt;1.) Wir verwenden keine extra Key Columns und nutzen den hoffentlich einmaligen Namen des Attributes. Ok, dann geht die Performance sehr wahrscheinlich recht bald den Bach runter, aber irgendwas ist ja immer… (mal im Ernst, damit kommen wir nicht weiter..)&lt;/p&gt;  &lt;p&gt;2.) Wir sagen den Anwendern, dass sich unser BI auf magische Weise über Nacht verändern kann und sie bitte auf den einen oder anderen Client verzichten sollten. (ok, ist auch nix… sehe ich ja ein…).&lt;/p&gt;  &lt;p&gt;3.) Wir investieren wesentlich mehr Zeit in die Datenbewirtschaftung und sorgen dafür, dass die Schlüssel der Attribute deterministisch sind! (bin offen für Punkt 4, 5 etc…)&lt;/p&gt;  &lt;p&gt;Also, sobald unser SSAS Projekt den Status Proof-of-Concept oder Prototyp verlässt und tatsächlich von den Anwendern produktiv eingesetzt wird, müssen wir uns mit dieser Thematik auseinandersetzen. Einen Ansatz dazu hatte ich schon mal kurz angerissen und zwar die &lt;a href="http://saschalorenz.blogspot.com/2011/03/die-reine-lehre-vom-sql-server-data.html"&gt;Verwaltung der Dimensionen in Key-Value-Tabellen&lt;/a&gt; erfolgen zu lassen. Auf den ersten Blick scheint dieser Ansatz unnötig kompliziert, aber er hat einige Vorteile. Einen zeigt dieser Artikel, da in den Key-Value Tabellen die Schlüssel für die Attribute bereits gepflegt werden. Damit umgehen wir die Herausforderung der “spontanen deterministischen” Vergabe! :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-156880920176865234?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/156880920176865234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/156880920176865234'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/sql-server-analysis-services-excel.html' title='SQL Server Analysis Services &amp;amp; Excel – “Bewegliche Ziele” oder wie wichtig ist eigentlich ein deterministischer Attribute Key?'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1gJtalph07w/Ta2Wvgq0kpI/AAAAAAAAAT4/lZsO1BWOgrE/s72-c/image_thumb36.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-3648081896360315813</id><published>2011-04-16T11:36:00.001+02:00</published><updated>2011-04-16T11:36:09.170+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLBits'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Veröffentlichungen'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQLBits 8 – Analysis Services Scale-Out Vortrag PowerPoint ist online</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/sqlbits-8-analysis-services-scale-out.html";digg_title = "SQLBits 8 – Analysis Services Scale-Out Vortrag PowerPoint ist online";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Mittlerweile ist der Download für die PowerPoint Folien für meinen Scale-Out für Analysis Services aktiv. In der Regel dauert es ein paar Wochen bis auch die Videoaufzeichnungen der Vorträge online gehen. Geduld! :-)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sqlbits.com/Downloads/234/SQLBits%208%202011.pdf"&gt;Die Slides bekommt Ihr hier!&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-3648081896360315813?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3648081896360315813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3648081896360315813'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/sqlbits-8-analysis-services-scale-out.html' title='SQLBits 8 – Analysis Services Scale-Out Vortrag PowerPoint ist online'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6855261080929775478</id><published>2011-04-14T16:31:00.001+02:00</published><updated>2011-04-14T16:31:44.042+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Reporting Services Skripte nutzen für die Bereitstellung von Reports</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/reporting-services-skripte-nutzen-fur.html";digg_title = "Reporting Services Skripte nutzen für die Bereitstellung von Reports";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Hier aktuell eine Notiz aus dem Feld zu den Reporting Services. &lt;/p&gt;  &lt;p&gt;Vielen Kunden als auch Kollegen ist es nicht bekannt, dass die Reporting Services auch auf sehr einfache Art und Weise per Skript-Sprache genutzt werden können. Daher hier ein kleines Beispiel dazu.&lt;/p&gt;  &lt;p&gt;Den SQL Server Reporting Services liegt ein Kommandozeilentool namens &lt;strong&gt;RS.EXE&lt;/strong&gt; bei. Dieses kann sowohl für administrative Aufgaben als für die Bereitstellung von Reports genutzt werden. Gerade das Skript (Batch) gesteuerte Erstellen von Reports in einem der Exportformate (z. B. PDF, XLS, DOC… ) ist für viele Kunden attraktiv. Wie kann so etwas umgesetzt werden?&lt;/p&gt;  &lt;p&gt;Es wird auf jeden Fall eine RSS Datei benötigt! RSS steht in diesem Fall für &lt;strong&gt;R&lt;/strong&gt;eporting &lt;strong&gt;S&lt;/strong&gt;ervices &lt;strong&gt;S&lt;/strong&gt;cript. :-)&lt;/p&gt;  &lt;p&gt;Hier der Inhalt einer Datei mit dem Namen “process.rss”, welche ich mit Notepad erstellt habe. Wie man sieht, ist das Ganze ein VBA Dialekt. Dieses einfache Beispiel rendert einen Report im PDF Format, für den das RDL File auf dem Report Server im Pfad “/Vertrieb/Demo” liegt. Das PDF wird direkt auf einem Fileshare im Pfad “f:\output\demo.pdf” erzeugt.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Public Sub Main()       &lt;br /&gt;&amp;#160; Dim fileName as String = &amp;quot;f:\output\demo.pdf&amp;quot;        &lt;br /&gt;&amp;#160; Dim reportPath as String = &amp;quot;/Vertrieb/Demo&amp;quot;        &lt;br /&gt;&amp;#160; Dim results() as Byte        &lt;br /&gt;        &lt;br /&gt;&amp;#160; rs.LoadReport(reportPath, Nothing) &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160; results = rs.Render(&amp;quot;PDF&amp;quot;,&amp;#160; Nothing, Nothing, Nothing, Nothing,&amp;#160; Nothing, Nothing)       &lt;br /&gt;        &lt;br /&gt;&amp;#160; Dim stream&amp;#160; As FileStream = File.OpenWrite(fileName)        &lt;br /&gt;&amp;#160; stream.Write(results, 0, results.Length)        &lt;br /&gt;Exec&amp;#160; stream.Close()        &lt;br /&gt;End Sub&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ausgeführt wird dieses kleine Skript mit folgender Kommandozeile:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;rs.exe –i process.rss –s http://localhost/ReportServer –e Exec2005&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Diese kann entweder direkt oder als Teil eines Batches und/oder zeitgesteuert ausgeführt werden. Allein schon mit diesem einfachen Skript lassen sich eine ganze Menge von Anforderungen in komplexeren Projekten “erschlagen” ohne extra dafür ein Tool in .NET zu erstellen! Wobei, ich mag ja .NET… &lt;/p&gt;  &lt;p&gt;Viel Spaß beim Ausprobieren!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6855261080929775478?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6855261080929775478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6855261080929775478'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/reporting-services-skripte-nutzen-fur.html' title='Reporting Services Skripte nutzen für die Bereitstellung von Reports'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6146213365050214548</id><published>2011-04-13T13:06:00.001+02:00</published><updated>2011-04-13T13:06:19.591+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLBits'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Analysis Services Synchronisieren von Cubes – Wer bleibt online? (Coaches’ Hell)</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/analysis-services-synchronisieren-von.html";digg_title = "Analysis Services Synchronisieren von Cubes – Wer bleibt online? (Coaches’ Hell)";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Vor ein paar Tagen habe ich ja über das &lt;a href="http://saschalorenz.blogspot.com/2011/03/sql-server-analysis-services.html"&gt;Synchronisieren von Cubes einen kleinen Artikel geschrieben und einen Webcast augenommen&lt;/a&gt;. Auf den SQLBits in Brighton hatte ich das Thema auch in meiner Session dabei.&lt;/p&gt;  &lt;p&gt;Ein Feedback dazu erreichte mich in den letzten Tagen immer wieder: &lt;strong&gt;Bleibt da alles online? Bleiben alle Connections erhalten? &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Dazu von mir der Hinweis: &lt;strong&gt;Nein, der “Target”, also die Analysis Services Instanz, welche die Synchronisation auslöst, bricht laut meiner Erfahrung die bestehenden Connections ab und braucht einen Re-Connect.&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6146213365050214548?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6146213365050214548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6146213365050214548'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/analysis-services-synchronisieren-von.html' title='Analysis Services Synchronisieren von Cubes – Wer bleibt online? (Coaches’ Hell)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6034904722429712665</id><published>2011-04-11T19:55:00.001+02:00</published><updated>2011-04-11T19:56:01.595+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server Usergroup Treffen in Hamburg April 2011 (Analysis Services Interna)</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/sql-server-usergroup-treffen-in-hamburg.html";digg_title = "SQL Server Usergroup Treffen in Hamburg April 2011 (Analysis Services Interna)";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Und schon wieder ist ein Monat rum und die Hamburger SQL Server Szene trifft sich am Donnerstag, den 14. April 2011, 18:30-20:30.&lt;/p&gt;  &lt;p&gt;Das ist dann unser 60. Treffen! Wow… &lt;/p&gt;  &lt;p&gt;Im April geht es um Interna in den SQL Server Analysis Services. Wir werfen gemeinsam einen Blick hinter die Kulissen der multidimensionalen Datenbank. Sowohl für den BI Berater als auch für den DBA interessant.&lt;/p&gt;  &lt;p&gt;Sicherlich finden wir auch noch die Zeit, um uns ein wenig über die gerade vergangene SQLBits Konferenz in UK auszutauschen.&lt;/p&gt;  &lt;p&gt;Veranstaltungsort ist:&lt;/p&gt;  &lt;p&gt;Deutscher Pressevertrieb, Düsternstraße 1, 20355 Hamburg   &lt;br /&gt;Ansprechpartner vor Ort: Wolfgang Gottschalk&lt;/p&gt;  &lt;p&gt;Würde mich sehr freuen, möglichst viele von Euch dort zu treffen! :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6034904722429712665?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6034904722429712665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6034904722429712665'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/sql-server-usergroup-treffen-in-hamburg.html' title='SQL Server Usergroup Treffen in Hamburg April 2011 (Analysis Services Interna)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4034861449684932267</id><published>2011-04-11T14:51:00.001+02:00</published><updated>2011-04-11T14:51:11.543+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLBits'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQLBits 8 - Resümee</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/sqlbits-8-resumee.html";digg_title = "SQLBits 8 - Resümee";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;So, die SQLBits 8 Konferenz ist nun vorbei. Zeit für ein letztes umfassendes Resümee!&lt;/p&gt;  &lt;p&gt;Super Sprecher!&lt;/p&gt;  &lt;p&gt;Super Lokation!&lt;/p&gt;  &lt;p&gt;Super Community Event!&lt;/p&gt;  &lt;p&gt;Und die SQLBits haben es sogar bis in die deutschen Nachrichten geschafft. Golem berichtet über sie, wenn auch leicht versteckt, beim zitieren eines Interviews mit Steve Wozniak (Mitgründer von Apple). &lt;a title="http://www.golem.de/1104/82675.html" href="http://www.golem.de/1104/82675.html"&gt;http://www.golem.de/1104/82675.html&lt;/a&gt; Der Hinweis, dass es sich um die größte europäische SQL Server Konferenz handelt wäre noch nett gewesen.&lt;/p&gt;  &lt;p&gt;Des Weiteren tauchen immer mehr Videos auf youtube auf. Unter anderem dieses hier… und ja, es war früh am Morgen… :-)&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:5c8ed98a-b065-4af0-bbd0-a53272949c8c" class="wlWriterSmartContent"&gt;&lt;div id="ed898592-40cc-4c72-81e0-5e79ae56f98c" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=Nc11JDZB6OY" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/_1gJtalph07w/TaL5OlftEmI/AAAAAAAAATw/uRJnHzgErDg/video86b92d525377%5B6%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('ed898592-40cc-4c72-81e0-5e79ae56f98c'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/Nc11JDZB6OY&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/Nc11JDZB6OY&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4034861449684932267?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4034861449684932267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4034861449684932267'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/sqlbits-8-resumee.html' title='SQLBits 8 - Resümee'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1gJtalph07w/TaL5OlftEmI/AAAAAAAAATw/uRJnHzgErDg/s72-c/video86b92d525377%5B6%5D.jpg?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-2680990902320609483</id><published>2011-04-10T19:25:00.001+02:00</published><updated>2011-04-10T19:25:57.446+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Attribute Keys für Analysis Services optimieren mit Hilfe von Dense_Rank (Coaches' Diary)</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/attribute-keys-fur-analysis-services.html";digg_title = "Attribute Keys für Analysis Services optimieren mit Hilfe von Dense_Rank (Coaches\' Diary)";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Vor einigen Tagen habe ich einen Tipp veröffentlicht mit dem herausgefunden werden kann welche &lt;a href="http://saschalorenz.blogspot.com/2011/03/coaches-diary-wie-finde-ich-ganz.html"&gt;Attribute innerhalb einer SSAS Dimension einen String als Key&lt;/a&gt; haben. Das gilt es ja in einem SSAS Projekt aus diversen Gründen (einer ist Performance und ich glaube der zweite Grund war Performance, auf den Dritten komme ich noch…) zu vermeiden.&lt;/p&gt;  &lt;p&gt;Nun kam die Frage auf, wie denn nun mit einfachen Mitteln dafür gesorgt werden kann, dass denn ein Integer Key auch immer verfügbar ist für das Attribut? Sofern das nicht über die Datenbewirtschaftung eines Data Warehouses gelöst wird (größeres Projekt…), dann muss das halt beim Aufbereitungsprozess für das Star-Schema eines “Cubes” (ich spreche ja eigentlich immer von SSAS Datenbanken) passieren. &lt;/p&gt;  &lt;p&gt;Häufig sind diese Aufbereitungsprozesse aber direkt an das Quellsystem gebunden und die Aufbereitung wird über Sichten (Views) realisiert. Wo ist da noch Platz für die Zuordnung von Integer Keys? Diese Herausforderung habe ich in der Praxis schon häufig vorgefunden und damit auch eine ganze Reihe von Lösungen, welche sich der jeweilige Kunde dazu überlegt hatte. Da wird mit gespeicherten Prozeduren gearbeitet, da werden Tabellen umkopiert und mit Update-Statements aufgefüllt und natürlich spielt das Distinct Argument dabei häufig eine wichtige Rolle, um überhaupt die eindeutigen Werte des Attributes zu finden.&lt;/p&gt;  &lt;p&gt;Hier möchte ich einen Lösungsansatz zeigen, welchen ich gerne verwende. Dazu nutze ich eine sogenannte Fensterrangfunktionen. Und zwar: &lt;strong&gt;DENSE_RANK()&lt;/strong&gt;. Was steht zu dieser Funktion in den BOL? &lt;/p&gt;  &lt;p&gt;&lt;em&gt;“Gibt den Rang von Zeilen innerhalb der Partition eines Resultsets ohne Lücken in der Rangfolge an. Der Rang einer Zeile ist 1 plus die Anzahl der Ränge vor der fraglichen Zeile.”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Ok, klar! Also genau was wir brauchen, oder? Nun ja, der Sinn und ganz besonders der Nutzen erschließt daraus nicht auf den ersten Blick. Daher ein Beispiel.&lt;/p&gt;  &lt;p&gt;Nehmen wir von der guten alten AdventureWorks2008R2 die Dimension &lt;em&gt;DimProduct.&lt;/em&gt; In dieser Dimension gibt es eine ganze Reihe von Attributen für welche nur Keys als String bereitstehen. Zum Beispiel &lt;em&gt;Color&lt;/em&gt; und es ist recht wahrscheinlich, dass unsere Anwender nach &lt;em&gt;Color&lt;/em&gt; den Cube schneiden wollen. Also muss eine Optimierung des Schlüssels her.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TaHoDtOQc0I/AAAAAAAAATc/Z0hxb6bDicw/s1600-h/image%5B10%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TaHoGiO9tEI/AAAAAAAAATg/xBA4Z51HYVA/image_thumb%5B6%5D.png?imgmax=800" width="463" height="136" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt; Nur wie kommen wir jetzt mit ohne Umweg an einen eindeutigen Integer Key für Color? Hier ein erstes Beispiel für DENSE_RANK().&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;select          &lt;br /&gt;color,          &lt;br /&gt;DENSE_RANK() OVER (ORDER BY COLOR) as Color_Key          &lt;br /&gt;from dbo.DimProduct;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Hier nutzen wir die Rangfunktion, um für die Spalte &lt;em&gt;Color&lt;/em&gt; den Rang für jeweils eine sogenannte Partition zu ermitteln. Diesen Rang nennen wir &lt;em&gt;Color_Key&lt;/em&gt;. Natürlich geht das nicht nur mit einem Attribute in einer Abfrage, sondern auch mit weiteren Attributen!&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;select          &lt;br /&gt;*,          &lt;br /&gt;DENSE_RANK() OVER (ORDER BY COLOR) as Color_Key,          &lt;br /&gt;DENSE_RANK() OVER (ORDER BY SIZE) as Size_Key,          &lt;br /&gt;DENSE_RANK() OVER (ORDER BY SizeRange) as SR_Key          &lt;br /&gt;from dbo.DimProduct;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Wir sehen, dass wir in unsere Abfrage ohne weiteres eine Funktion einbauen können, welche uns für unsere Attribute die “notwendigen” Keys liefert. Damit kann also ohne größeren Umweg oder Aufwand unser Analysis Services Cubes optimiert werden. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TaHoHCdwMVI/AAAAAAAAATk/PlXfDEAuQ4c/s1600-h/image%5B21%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TaHoINjbQvI/AAAAAAAAATo/jjfP1EXmkH4/image_thumb%5B13%5D.png?imgmax=800" width="417" height="133" /&gt;&lt;/a&gt; Viel Spaß beim Ausprobieren!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-2680990902320609483?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2680990902320609483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2680990902320609483'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/attribute-keys-fur-analysis-services.html' title='Attribute Keys für Analysis Services optimieren mit Hilfe von Dense_Rank (Coaches&amp;#39; Diary)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1gJtalph07w/TaHoGiO9tEI/AAAAAAAAATg/xBA4Z51HYVA/s72-c/image_thumb%5B6%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4415769875408884767</id><published>2011-04-08T20:49:00.001+02:00</published><updated>2011-04-08T20:49:41.303+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLBits'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQLBits 8 – Brighton, UK - Freitag</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/sqlbits-8-brighton-uk-freitag.html";digg_title = "SQLBits 8 – Brighton, UK - Freitag";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;So, der Freitag in Brighton neigt sich dem Ende. Und selten wurde ein Motto so konkret umgesetzt: Beside the seaside… &lt;/p&gt;  &lt;p&gt;Die letzten Partygäste verlassen das Haus. Auf der Ausklang Party gab es u.a. Fish &amp;amp; Chips und ein kühles Wetter, was bei dem Wetter hier auch dankend angenommen wurde! Wobei englisches Essen polarisierte schon ein wenig bei den nicht-englischen Teilnehmern. &lt;/p&gt;  &lt;p&gt;Meine Session “&lt;a href="http://saschalorenz.blogspot.com/2011/04/sqlbits-8-in-brightonuk-morgen-geht-es.html"&gt;28 weeks later – How to scale-out your MS Business Intelligence environment&lt;/a&gt; ”verlief weitestgehend wie erwartet und ohne größere Probleme. Es waren trotz prominenter “Konkurrenz” erstaunlich viele Teilnehmer bei so einem recht speziellem Thema im Raum. Vielen Dank dafür! &lt;/p&gt;  &lt;p&gt;Und es waren dieses mal deutlich mehr Teilnehmer aus Deutschland dabei.&lt;/p&gt;  &lt;p&gt;Bin schon sehr gespannt wohin es die &lt;a href="http://www.sqlbits.com/"&gt;SQLBits&lt;/a&gt; 9 dann wohl verschlagen wird… nur das Königreich steht schon fest! :-)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TZ9YrI_MWTI/AAAAAAAAAS0/DHWFP2F2HtM/s1600-h/GEDC0732%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="GEDC0732" border="0" alt="GEDC0732" src="http://lh4.ggpht.com/_1gJtalph07w/TZ9YsPxg-tI/AAAAAAAAAS4/1e70XlKSDEo/GEDC0732_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160; &lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TZ9YssdinuI/AAAAAAAAAS8/oR2G4uwBKic/s1600-h/GEDC0717%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="GEDC0717" border="0" alt="GEDC0717" src="http://lh3.ggpht.com/_1gJtalph07w/TZ9Ys-lMLWI/AAAAAAAAATA/_3NmJlSJOoQ/GEDC0717_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TZ9YuC4XNtI/AAAAAAAAATE/ly9LnaKwDpw/s1600-h/GEDC0735%5B7%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="GEDC0735" border="0" alt="GEDC0735" src="http://lh4.ggpht.com/_1gJtalph07w/TZ9YueV3LMI/AAAAAAAAATI/zv4mDCt4o_U/GEDC0735_thumb%5B3%5D.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&amp;#160; &lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TZ9YvPq_AiI/AAAAAAAAATM/MuR8OYqvkqs/s1600-h/GEDC0734%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="GEDC0734" border="0" alt="GEDC0734" src="http://lh4.ggpht.com/_1gJtalph07w/TZ9YviB2gPI/AAAAAAAAATQ/hmXlEaiN0hY/GEDC0734_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt; &lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TZ9YwDbopbI/AAAAAAAAATU/5Jfr3xvfe_g/s1600-h/GEDC0730%5B2%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="GEDC0730" border="0" alt="GEDC0730" src="http://lh3.ggpht.com/_1gJtalph07w/TZ9Ywp_9yTI/AAAAAAAAATY/ECdW6KCRw2o/GEDC0730_thumb.jpg?imgmax=800" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4415769875408884767?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4415769875408884767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4415769875408884767'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/sqlbits-8-brighton-uk-freitag.html' title='SQLBits 8 – Brighton, UK - Freitag'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1gJtalph07w/TZ9YsPxg-tI/AAAAAAAAAS4/1e70XlKSDEo/s72-c/GEDC0732_thumb.jpg?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6968251766740030738</id><published>2011-04-06T18:52:00.001+02:00</published><updated>2011-04-06T18:52:31.422+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLBits'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQLBits 8 in Brighton/UK – Morgen geht es los!</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/04/sqlbits-8-in-brightonuk-morgen-geht-es.html";digg_title = "SQLBits 8 in Brighton/UK – Morgen geht es los!";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Und schon wieder ist es soweit! Morgen startet in Brighton, UK die wohl größte europäische SQL Server Konferenz! Wie immer haben die Organisatoren einen schönen Ort in England ausgesucht. Die Konferenz findet dieses mal im “The Grand” in Brighton statt. Hier mal eine Impression. Allein deswegen wird sich wohl der Weg lohnen.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/TZyaQVKNNaI/AAAAAAAAASg/AhGtM541C0Q/image%5B10%5D.png?imgmax=800" width="537" height="259" /&gt; &lt;/p&gt;  &lt;p&gt;Am Freitag bin ich ja dann als Sprecher dabei und darf als “quasi” Fortsetzung zum “&lt;a href="http://www.sqlbits.com/Sessions/Event7/The_Developer_Side_of_the_Microsoft_Business_Intelligence_stack"&gt;The Developer Side of Microsoft Business Intelligence&lt;/a&gt;” einen Vortrag über Scale-Out Projekte mit den SQL Server Analysis Services halten. Mein Vortrag heißt dieses mal “&lt;a href="http://www.sqlbits.com/Sessions/Event8/28_Weeks_later-How_to_scale-out_your_MS_Business_Intelligence_environment"&gt;28 Weeks later - How to scale-out your MS Business Intelligence Environment&lt;/a&gt;”. Spannendes Thema, hoffentlich finden das die Teilnehmer auch.&lt;/p&gt;  &lt;p&gt;Hier eine kleine Vorschau auf das Slidedeck.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TZyaRCiEQ5I/AAAAAAAAASk/92f-xuWzpV4/s1600-h/image%5B39%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TZyaRkJr-KI/AAAAAAAAASo/C31wERID-Jc/image_thumb%5B25%5D.png?imgmax=800" width="443" height="329" /&gt;&lt;/a&gt;&amp;#160; &lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TZyaSADCcFI/AAAAAAAAASs/ZF1JVxNsgwk/s1600-h/image%5B32%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TZyaSmxbFgI/AAAAAAAAASw/5gofJVDxAa0/image_thumb%5B14%5D.png?imgmax=800" width="440" height="329" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vieleicht treffe ich ja dieses mal mehr Deutsche (oder zumindest deutschsprachige) Teilnehmer der SQL Server Community als in York! Würde mich sehr freuen!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6968251766740030738?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6968251766740030738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6968251766740030738'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/04/sqlbits-8-in-brightonuk-morgen-geht-es.html' title='SQLBits 8 in Brighton/UK – Morgen geht es los!'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/TZyaQVKNNaI/AAAAAAAAASg/AhGtM541C0Q/s72-c/image%5B10%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-920922197788323875</id><published>2011-03-30T18:04:00.001+02:00</published><updated>2011-03-30T18:04:45.321+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Coaches’ Diary: Wie finde ich ganz einfach und schnell in einem Analysis Services Projekt alle Attribute, welche keinen Integer als Key haben…</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/03/coaches-diary-wie-finde-ich-ganz.html";digg_title = "Coaches’ Diary: Wie finde ich ganz einfach und schnell in einem Analysis Services Projekt alle Attribute, welche keinen Integer als Key haben…";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Hier ein kleiner Kniff aus der Coaching Praxis! &lt;/p&gt;  &lt;p&gt;Da erkläre ich einem Kunden im Coaching lang und breit in Farbe und 3D, dass Attribute das A bis Z in einer multidimensionalen Datenbank sind und, ganz ganz wichtig, bitte als Keys bitte nur Integer Spalten verwendet werden sollten. So von wegen Performance und so! Ok, haben die meisten von Euch wohl auch schon von gehört bzw. gelesen. Ist bei größeren und komplexeren Umgebungen wirklich wichtig! Ehrlich!&lt;/p&gt;  &lt;p&gt;Natürlich kommt vom Kunden die Aussage, dass sie das ganz sicher bedacht hätten. Ich hatte da so meine Zweifel, aber keinerlei Tools zur Hand bzw. auf dem Kundenserver, um das nun kurz mal zu überprüfen. Alternative wäre ein manuelles Suchen gewesen. Da fiel mir etwas ein! Mit der Power der Kommandozeile lässt sich das nämlich herausfinden! &lt;/p&gt;  &lt;p&gt;Es folgt dieses magische Kommando:&lt;/p&gt;  &lt;p align="center"&gt;&lt;strong&gt;&lt;em&gt;dir *.ksstore /s&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Und schon werden alle Attribute &amp;amp; die Dimensionen angezeigt, welche einen String im Key haben! Da ich die Kundendatenbank nicht nehmen kann, hier die AdventureWorks2008R2 als Beispiel:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TZNUjOBr7kI/AAAAAAAAAR4/wtalWTgUBm8/s1600-h/image%5B6%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TZNUj52RBBI/AAAAAAAAAR8/f-SiOT3G3iY/image_thumb%5B4%5D.png?imgmax=800" width="525" height="519" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Der Befehl ist im jeweiligen Ordner auf der Server abzusetzen, in welchem die SSAS DB liegt. Also hier beim Beispiel für ADW2008R2..&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TZNUkKBnXKI/AAAAAAAAASA/qvtxd5kpV0U/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TZNUkYEZBlI/AAAAAAAAASE/uMxDO04Svhw/image_thumb%5B7%5D.png?imgmax=800" width="899" height="45" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Wenn nicht klar sein sollte, wo die Datenbanken liegen, dann die SSAS Eigenschaft DataDir anschauen im Management Studio.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TZNUk6wCS5I/AAAAAAAAASI/bC_hLo7NKhI/s1600-h/image%5B16%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TZNUlOyk8DI/AAAAAAAAASM/KbjCpra5s3Y/image_thumb%5B10%5D.png?imgmax=800" width="850" height="131" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Natürlich könnte das DIR auch eine Ebene höher ausgeführt werden, dann würden wir für alle Datenbanken alle Attribute mit Strings im Key sehen.&lt;/p&gt;  &lt;p&gt;Ein schönes Beispiel in Adventure Works 2008 R2 ist in &lt;strong&gt;Geography&lt;/strong&gt; das Attribute &lt;strong&gt;City! &lt;/strong&gt;Hier unser Output…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TZNUlXcjPiI/AAAAAAAAASQ/EE_5XAe65MA/s1600-h/image%5B27%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/TZNUl0R8rGI/AAAAAAAAASU/3IVR75stb7A/image_thumb%5B17%5D.png?imgmax=800" width="651" height="63" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Und hier die Eigenschaften des Attributes im Projekt:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TZNUmLu4w_I/AAAAAAAAASY/bREuSSW2mKk/s1600-h/image%5B26%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TZNUmhFmrFI/AAAAAAAAASc/9wt8bIn-il4/image_thumb%5B16%5D.png?imgmax=800" width="475" height="94" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ach ja, und was ist jetzt ein *.ksstore? &lt;/p&gt;  &lt;p&gt;Relativ einfach zu sagen. Im Gegensatz zur relationalen Engine, wo wir ja “nur” mdf, ndf’s und ein ldf pro Datenbank haben, zerlegt SSAS die Datenbank in Tausende von Dateien. Mehrere Dateien pro Attribute zum Beispiel. Allein für den Key eines Attributes gibt es eine *.kstore (Key Store) und eine *.khstore (Key Hash Store). Nun ja, und NUR für den Fall, dass der Key aus Strings besteht auch noch eine *.ksstore (Key String Store)! &lt;strong&gt;Die ist sozusagen optional!&lt;/strong&gt;&amp;#160; :^)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-920922197788323875?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/920922197788323875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/920922197788323875'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/03/coaches-diary-wie-finde-ich-ganz.html' title='Coaches’ Diary: Wie finde ich ganz einfach und schnell in einem Analysis Services Projekt alle Attribute, welche keinen Integer als Key haben…'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1gJtalph07w/TZNUj52RBBI/AAAAAAAAAR8/f-SiOT3G3iY/s72-c/image_thumb%5B4%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-5763699516911163175</id><published>2011-03-30T08:24:00.001+02:00</published><updated>2011-03-30T08:24:29.527+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server Analysis Services Synchronization fürs Deployment mit SSMS, SSIS &amp; ADOMD.NET</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/03/sql-server-analysis-services.html";digg_title = "SQL Server Analysis Services Synchronization fürs Deployment mit SSMS, SSIS &amp; ADOMD.NET";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Im Rahmen der von mir durchgeführten Coachings &amp;amp; Trainings für die SQL Server Analysis Services stelle ich immer wieder fest, dass sich viele Anwender/Entwickler damit zufrieden geben einen “Cube” auf einem Server zu verarbeiten und diesen von dort aus zu nutzen bzw. die Anwender darauf zugreifen zu lassen. In vielen Umgebungen ist dieses Vorgehen, um die Anforderungen zu erfüllen, völlig ausreichend. Für komplexere Umgebungen und mit mehr Last und/oder keinem echten Wartungsfenster sind die Anforderungen aber deutlich höher. Die Arbeit mit mehreren SSAS Instanzen wird dabei durchaus in Betracht gezogen, aber das Deployment der SSAS DB wird häufig manuell durchgeführt bzw. es wird “nur” das Projekt verschoben. Resümee ist, dass multidimensionale Datenbanken häufig auf jedem Server aufs Neue verarbeitet werden. Dabei hat Microsoft den SSAS einige sehr nützliche Funktionen auf den Weg gegeben, um genau das zu vermeiden.&lt;/p&gt;  &lt;p&gt;Eine davon ist die &lt;strong&gt;Synchronisation&lt;/strong&gt; von SSAS Datenbanken. Hierbei wird vom Ziel-Server ausgehend eine Datenbank (aka Cubes) von einem Quell-Server übertragen. Dieses Feature kann sowohl in der GUI des SQL Server Management Studios (SSMS) durchgeführt werden, als auch in Integration Services und in .NET Code. Es gibt sicherlich noch weitere Möglichkeiten wie PowerShell etc., aber das sprengt dann irgendwann den Rahmen. :-) &lt;/p&gt;  &lt;p&gt;In dem folgenden kleinen Cast demonstriere ich einige der Möglichkeiten, um den Synchronisationsprozess anzustoßen. Auf Details wie Remote Partitionen gehe ich bewusst nicht ein, da dafür noch ein wenig mehr Theorie für die Nutzung notwendig ist. Liefere ich aber bei Zeiten nach!&lt;/p&gt;  &lt;p&gt;Viel Spaß mit dem Cast! Bei Fragen, Kommentaren, Anregungen und gar Wünschen für weitere Themen…–&amp;gt; einfach melden!&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:cd2843c4-c15f-479e-b98b-6dd75d968744" class="wlWriterSmartContent"&gt;&lt;div id="3d3f3482-4f2e-4d8b-9de4-859b6ef406ee" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=1Nku454lXz4" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/_1gJtalph07w/TZLMmZoYmuI/AAAAAAAAAR0/ehKv2y6JtOs/video91906c5e128e%5B7%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('3d3f3482-4f2e-4d8b-9de4-859b6ef406ee'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/1Nku454lXz4&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/1Nku454lXz4&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-5763699516911163175?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5763699516911163175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5763699516911163175'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/03/sql-server-analysis-services.html' title='SQL Server Analysis Services Synchronization fürs Deployment mit SSMS, SSIS &amp;amp; ADOMD.NET'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1gJtalph07w/TZLMmZoYmuI/AAAAAAAAAR0/ehKv2y6JtOs/s72-c/video91906c5e128e%5B7%5D.jpg?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-8495178297690276982</id><published>2011-03-25T18:56:00.001+01:00</published><updated>2011-03-25T18:56:49.129+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Landing Area (Zone) im SQL Server Data Warehouse</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/03/landing-area-zone-im-sql-server-data.html";digg_title = "Landing Area (Zone) im SQL Server Data Warehouse";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Noch ein wenig was zum Thema Data Warehouse Design. &lt;/p&gt;  &lt;p&gt;Diese Woche hatte ich u. a. ein Meeting, bei dem erwähnt wurde, dass der Begriff Landing Zone bzw. Landing Area im Zusammenhang mit Data Warehouse Architekturen bisher den Teilnehmern nicht bekannt war. Für mich ist die Nutzung einer Landing Area in einer Data Warehouse Umgebung ein wesentliches Element, um eine beherrschbare Lösung zu erstellen. Ihr erinnert Euch vielleicht, dass für mich die spätere &lt;a href="http://saschalorenz.blogspot.com/2011/03/meine-top-10-ratschlage-fur-komplexere.html"&gt;“Beherrschung” der Business Intelligence Lösung&lt;/a&gt; ein elementarer Punkt ist und mir meist wichtiger ist, als irgendwelche technischen Spielereien auf der “Bit-Ebene…”. Und daher hier kurz eine Erläuterung meiner Sicht auf eine Landing Zone, welche gerne auch mal Landing Area heißt.&lt;/p&gt;  &lt;p&gt;Die Aufteilung eines ETL Prozesses in sogenannte Stages ist mittlerweile relativ bekannt. Also die Daten, welche für das Data Warehouse benötigt werden, durchlaufen im Datenbewirtschaftungsprozess diverse Schritte (Stages) zur Überprüfung und Verarbeitung, bevor sie im finalen Load-Prozess ins DWH geladen werden.&lt;/p&gt;  &lt;p&gt;Die Landing Zone setzt nun auf der gegenüberliegenden Seite an! Hier fängt der ETL Prozess an. Wichtig ist die Erkenntnis, dass der ETL Prozess eigentlich aus diversen voneinander getrennten Prozessen/Jobs/Paketen/What-ever besteht. Es gibt u.a. diverse Extract-Prozesse (das E in ETL), welche die Daten aus den Vorsystemen “einsammeln”. Nun gibt es aber auch noch den häufigen Fall, dass die Vorsysteme die Daten von sich aus automatisch liefern. Wohin also mit diesen gepushten Daten? Das ist die ursprüngliche Idee hinter der Landing Zone. Hier laden die Vorsysteme Ihre Daten ab. Entweder Deltas, Transaktionslog, Backups, Flats usw. Meist ist die Landing Area aus technischer Sicht eine Ordnerfreigabe auf einem Server. Aus dieser holen sich dann die Prozesse des ETL Jobs die dort “gelandeten” Daten ab und verarbeiten diese weiter. Natürlich kann es auch vorkommen, dass Datenpakete abgewiesen werden, weil die Datenqualität nicht die Geschäftsregeln erfüllen oder einfach was fehlerhaft ist im Format.&lt;/p&gt;  &lt;p&gt;Meine Nutzung der Landing Zone geht noch ein wenig weiter, da ich einfach (ich mag einfache Lösungen bei komplexen Herausforderungen) alle Extract Prozesse ihre Ergebnisse in die Landing Zone ablegen lasse. Auch die Jobs, welche klassisch exportieren. Dazu nutze ich i. d. R. beim SQL Server die Integration Services (SSIS) und lasse die Daten im Rohdatenformat (RAW Format) in der Freigabe ablegen. Die weiteren Prozesse nehmen dann diese Dateien als Quelle auf und verarbeiten sie entsprechend weiter. &lt;/p&gt;  &lt;p&gt;Der Vorteil einer Landing Area ist u.a., dass der ETL Prozess nicht direkt an den Vorsystemen hängt, sondern von diesen losgelöst ist. Eine asynchrone Verarbeitung zahlt sich auch hier aus, wenn das Ganze ein wenig unübersichtlicher von der Anzahl der Quellen und Prozesse wird. Des Weiteren kann der Inhalt der Landing Area, welcher im übrigen immer nur temporär dort liegt, ganz hervorragend mit einem Komprimierungstool in Paketform historisiert werden. Die Historisierung führe ich gerade bei ganz frischen Data Warehouse Umgebungen gerne durch, um noch evtl. Fehler in der Verarbeitung durch einen “Reset” des DWHs zu kompensieren ohne eine Datenverlust in der Historisierung zu haben. &lt;strong&gt;Daher gehört für mich eine Landing Area zu jedem komplexeren Data Warehouse!&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-8495178297690276982?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8495178297690276982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8495178297690276982'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/03/landing-area-zone-im-sql-server-data.html' title='Landing Area (Zone) im SQL Server Data Warehouse'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-5408363183173391352</id><published>2011-03-22T19:20:00.001+01:00</published><updated>2011-03-22T19:20:49.498+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Der Presentation Layer im Allgemeinen und speziell in einem SQL Server Data Warehouse</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/03/der-presentation-layer-im-allgemeinen.html";digg_title = "Der Presentation Layer im Allgemeinen und speziell in einem SQL Server Data Warehouse";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;In meinem letzten Blogpost habe ich ja ein wenig über Vorschläge für den &lt;a href="http://saschalorenz.blogspot.com/2011/03/die-reine-lehre-vom-sql-server-data.html"&gt;Entwurf von Data Warehouse Umgebungen im Kontext SQL Server&lt;/a&gt; geschrieben. Und mir war klar, dass ich polarisieren werde. Hab es ja so gewollt. Gab dann ja auch schön Feedback von der Community zurück. Daher hier nun weitere Erläuterungen zu dem Thema.&lt;/p&gt;  &lt;p&gt;Ein Punkt, welcher Inhalt des Feedbacks an mich war, ist das Thema Presentation Layer im Data Warehouse. Dazu wird viel in der begleitenden Literatur geschrieben und ich habe auch schon viel PowerPoint dazu gesehen. Teilweise wird sowohl in Form eines Prozesses von einem Presentation Layer gesprochen wird als auch bei einer statischen Architektur. Da sehe ich aber durchaus einen Unterschied!&lt;/p&gt;  &lt;p&gt;Hier zur Visualisierung ein paar Beispiele:&lt;/p&gt;  &lt;p&gt;Bei der Prozessdarstellung kommt der Presentation Layer meist “am Ende” des Prozesses, als der Teil, welcher dann von “Außen” sichtbar sein wird. Der Presentation Layer wird zum Beispiel im Rahmen eines ETL Prozesses am Ende “erzeugt”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TYjoaKkrbuI/AAAAAAAAARQ/9CO854geY24/s1600-h/image%5B34%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/TYjobs1UgvI/AAAAAAAAARU/3weNYX20V40/image_thumb%5B12%5D.png?imgmax=800" width="244" height="243" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Dann gibt es den Ansatz bei einer Architektur vom Presentation Layer zu sprechen. Ich habe also diverse´Ebenen in meiner Architektur und wieder ist nur eine von “Außen” sichtbar. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TYjocOkHncI/AAAAAAAAARY/O6znFPPSdFc/s1600-h/image%5B35%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TYjocx-k--I/AAAAAAAAARc/DjagjO14IbU/image_thumb%5B13%5D.png?imgmax=800" width="244" height="284" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Jetzt kann natürlich diskutiert werden, wo denn nun der Presentation Layer anfängt? Im Data Warehouse oder sind Cubes in den Analysis Services erst der Presentation Layer? Dann hätte das Data Warehouse in dem Sinne gar keinen Presentation Layer, sondern die OLAP Cubes erfüllen diese Rolle. Das käme dem Prozessbeispiel auch wieder nahe, da die Cubes ja erst am Ende des Datenbewirtschaftungsprozesses “entstehen”. Die Cubes wären dann so etwas wie Data Marts.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TYjodSpoQII/AAAAAAAAARg/O5yJW0cZNEs/s1600-h/image%5B36%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TYjoeKWnJ9I/AAAAAAAAARk/Aqj5m_m-kvs/image_thumb%5B14%5D.png?imgmax=800" width="244" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Kommen wir zu meinen Anregungen aus meinem Blogpost. Dort schlug ich ja vor, dass das Schema des Data Warehouse für sich bereits diverse Abstraktionen enthalten dürfte, sofern diese die &lt;strong&gt;Entwicklungs- und Betriebsprozesse unterstützen&lt;/strong&gt; und den &lt;strong&gt;Anwendern nicht im Weg stehen&lt;/strong&gt;. Dabei ist mein Vorschlag, dass auch einzelne Objekte wie Attribute, Dimensionen, Hierarchien etc. gerne jeweils ihre eigene Abstraktion haben dürfen und sich auch gegenüber den anderen Objekten nur durch diese “mitteilen”. Im Hintergrund gibt es dann ein Meta-Universum, welches die Objekte zusammenhält. Das mag der eine oder andere aus der objektorientierten Programmierung kennen. &lt;/p&gt;  &lt;p&gt;Nur von den Faktentabellen lasse ich in der Regel die Finger was Abstraktionen angeht, da diese bei echten Massendaten äußerst kontraproduktiv wären!&lt;/p&gt;  &lt;p&gt;Hier also ein Beispiel für einen Ansatz, bei dem die Objekte jeweils Ihren eigenen Presentation Layer für eine Abstraktion haben. Das darf dann gerne auch mehrmals geschachtelt sein, wenn es denn die Prozesse genügend unterstützt.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TYjoesruleI/AAAAAAAAARo/Hpij9jDUEU0/s1600-h/image%5B37%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TYjofVDb_jI/AAAAAAAAARs/FjEsG7RKBKg/image_thumb%5B15%5D.png?imgmax=800" width="244" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Es ist immer zu klären, ob sich der Aufwand und die Komplexität, welche die Arbeit mit Abstraktionen mit sich bringt, auch wirklich rentiert. Die IT ist voll von Beispielen für positive als auch negativen Ansätzen. Das muss im Einzelfall jeweils mit dem Kunden diskutiert werden. &lt;/p&gt;  &lt;p&gt;Im Zweifel ist aber das Ziel der Suche nach dem Presentation Layer immer eine Definitionsfrage! :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-5408363183173391352?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5408363183173391352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5408363183173391352'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/03/der-presentation-layer-im-allgemeinen.html' title='Der Presentation Layer im Allgemeinen und speziell in einem SQL Server Data Warehouse'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/TYjobs1UgvI/AAAAAAAAARU/3weNYX20V40/s72-c/image_thumb%5B12%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4904647037517300776</id><published>2011-03-21T13:42:00.001+01:00</published><updated>2011-03-21T13:42:57.225+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Die reine Lehre vom SQL Server Data Warehouse Entwurf…</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/03/die-reine-lehre-vom-sql-server-data.html";digg_title = "Die reine Lehre vom SQL Server Data Warehouse Entwurf…";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Heute Abend ist zwar schon wieder ein Treffen der Hamburger SQL Server Community (PASS Chapter), aber ich kam noch gar nicht dazu das letzte Treffen zu reflektieren. War ein super Treffen, viele Leute, gute Diskussionen und eine klasse Lokation!&lt;/p&gt;  &lt;p&gt;Bei dem Treffen habe ich eine lockere Liste von Punkten vorgestellt, welche aus meiner Sicht wichtig für den Erfolg von komplexeren Data Warehouse &amp;amp; Business Intelligence Projekten sind. Ein Punkt dabei war, dass ich vorgeschlagen habe, beim Entwurf für ein Data Warehouse ganz bewusst zwischen dem Presentation Layer und der eigentlichen technischen Implementierung in der Datenbank zu unterscheiden. Ich ging dabei soweit, dass ich vorschlagen habe für die physische Modellierung der Dimensionen sogenannte Key-Value-Tabellen einzusetzen. &lt;a href="http://saschalorenz.blogspot.com/2011/01/wieder-einmal-das-repository-oder-auch.html"&gt;Dabei geht mein Ansatz wieder vom Attribut als Mittelpunkt aus&lt;/a&gt;. Das löste natürlich Diskussionen aus!&lt;/p&gt;  &lt;p&gt;Wobei ich immer sage, dass es ja KEINE Silver Bullet gibt! Also eine universelle wirklich für jeden passende Lösung! &lt;a href="http://saschalorenz.blogspot.com/2011/02/coaches-hell-wie-entwickle-ich-denn.html"&gt;Habe ich ja schon oft drauf hingewiesen&lt;/a&gt;. Und auch dieser Ansatz passt bei weitem nicht auf jedes Projekt.&lt;/p&gt;  &lt;p&gt;Mir ist nur über die Jahre hinweg aufgefallen, dass sich langsam die Meinung durchsetzt, ein Data Warehouse muss sowohl logisch als auch physisch dem klassischen Star-Schema folgen. Und viele Herausforderungen, oder heute nenne ich sie mal bewusst Probleme, entstehen da heraus, dass sich die DWH Entwickler fast ein Bein ausreißen dieser Linie zu folgen.&lt;/p&gt;  &lt;p&gt;Achtung! Ich meine nicht, dass wir auf Dimensionen und Fakten verzichten sollen! Ganz im Gegenteil. Bin immer wieder fasziniert bis entsetzt, was so als Dimension oder Fakt durchgeht. Diese Aufteilung (und der restliche theoretische Background eines Kimball etc.) macht auf jeden Fall Sinn! Nur halt nicht immer wirklich auf der physischen Ebene.&lt;/p&gt;  &lt;p&gt;Natürlich stellt sich dann die Frage: Warum geht der Trend in diese Richtung? Ich kann mich noch durchaus an Zeiten erinnern, da waren Data Warehouse Systeme noch hoch komplizierte Werke, welche kein Reporting (bzw. OLAP)Tool&amp;#160;&amp;#160; dieser Welt wirklich nutzen konnte. Da ist eine Orientierung in Richtung Star-Schema natürlich von Vorteil. Des Weiteren scheinen die heute verfügbaren Werkzeuge die DWH Entwickler dazu zu motivieren, gleich in Dimensionen und Fakten zu denken. Zweischneidig das Ganze.&lt;/p&gt;  &lt;p&gt;Das nimmt auch die Integration Services des SQL Servers (SSIS) nicht aus. Gerade die Integration Services geben dem DWH Entwickler äußerst leistungsfähige Komponenten an die Hand, welche unmoderiert leicht über das eigentliche Ziel hinausschießen. SSIS Komponenten für SCDs tun da ein übriges. &lt;/p&gt;  &lt;p&gt;Jegliche Abstraktion bleibt dabei auf der Strecke und wer meinen Empfehlungen und Vorträgen ein wenig gefolgt ist, weiß ja schon wie sehr ich eine gute und saubere Abstraktion in Systemen schätze! :-)&lt;/p&gt;  &lt;p&gt;Die Frage nach den Vorteilen ist da natürlich gerechtfertigt und lässt in der Regel auch nicht lange auf sich warten:&lt;/p&gt;  &lt;p&gt;- Anreicherung der Strukturen im Hintergrund durch Metadaten   &lt;br /&gt;- Integration von Data Quality Informationen und Prozessen    &lt;br /&gt;- Anbindung an ein Master Data Management System (wie z.B. Master Data Services)    &lt;br /&gt;- Nutzung eines Repositorys (wen hätte es gewundert…)    &lt;br /&gt;- etc.&lt;/p&gt;  &lt;p&gt;Wenn ich das Thema bringe, dann weht mir natürlich oft gleich ne steife Brise ins Gesicht. Nur solange die Argumentation in die Richtung “Darum!” oder “Weil man das halt so macht…” geht, dann läuft da was falsch und das Thema muss mal sachlich diskutiert werden&lt;/p&gt;  &lt;p&gt;Und um eventuelle Bedenken bezüglich der Performance auszuräumen, möchte ich an dieser Stelle die Indizierung von Views als Feature der Wahl vorstellen. Damit lässt sich so eine Umgebung dann auch durchaus zügig nutzen, also sofern nötig.&lt;/p&gt;  &lt;p&gt;Ein weiterer Punkt ist meiner Meinung nach zu erwähnen: Der Presentation Layer hat nichts im Data Source View (DSV) der Analysis Services zu suchen!&lt;/p&gt;  &lt;p&gt;Und ja, ich möchte an dieser Stelle durchaus polarisieren! :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4904647037517300776?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4904647037517300776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4904647037517300776'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/03/die-reine-lehre-vom-sql-server-data.html' title='Die reine Lehre vom SQL Server Data Warehouse Entwurf…'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-5838198011123176012</id><published>2011-03-10T17:22:00.002+01:00</published><updated>2011-03-30T18:16:36.677+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Meine Top 10 Ratschläge für komplexere SQL Server BI Projekte aus dem PASS Vortrag vom 9.3.2011 in Hamburg</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float: right; margin: 0px; padding: 0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/03/meine-top-10-ratschlage-fur-komplexere.html";digg_title = "Meine Top 10 Ratschläge für komplexere SQL Server BI Projekte aus dem PASS Vortrag vom 9.3.2011 in Hamburg";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;Gestern Abend hatten wir in Hamburg ein volles Haus! Vielen Dank an alle aktiven Teilnehmer unser Community!&lt;br /&gt;Hier meine gestrige Liste der Ratschläge für komplexere und anspruchsvollere Business Intelligence Projekte. Ich hoffe, dass für jeden was dabei war. Das eine oder andere Thema werden wir sicherlich in den nächsten Monaten noch vertiefen. Es gab gestern ja schon einge sehr gute Diskussionen. Hat Spaß gemacht!&lt;br /&gt;10. Think big, act small&lt;br /&gt;9. (Be)herrsche und teile&lt;br /&gt;8. Denke und spreche in Pattern&lt;br /&gt;7. Wähle ein „quasi“ wiederverwendbares Datenbank Schema&lt;br /&gt;6. RAW &amp;amp; Staging nutzen&lt;br /&gt;5. Vermeide Optimierungen&lt;br /&gt;4. Lerne alles über Partitionen!&lt;br /&gt;3. Arbeite mit Queues / sein immer asynchron unterwegs&lt;br /&gt;2. Paketausführung extern steuern &amp;amp; verhindern&lt;br /&gt;1. Nutze den „ganzen“ Microsoft Technologie Stack&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-5838198011123176012?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5838198011123176012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5838198011123176012'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/03/meine-top-10-ratschlage-fur-komplexere.html' title='Meine Top 10 Ratschläge für komplexere SQL Server BI Projekte aus dem PASS Vortrag vom 9.3.2011 in Hamburg'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-8602669575498725246</id><published>2011-03-08T10:40:00.001+01:00</published><updated>2011-03-08T10:40:35.295+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Best Practices in BI Projekten Vortrag auf dem SQL Server Usergroup Treffen in Hamburg (PASS)</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/03/best-practices-in-bi-projekten-vortrag.html";digg_title = "Best Practices in BI Projekten Vortrag auf dem SQL Server Usergroup Treffen in Hamburg (PASS)";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Morgen ist es ja schon wieder soweit! Unser reguläres Märztreffen für die SQL Server Community in Hamburg seht für Morgen Abend an.&lt;/p&gt;  &lt;p&gt;Thema wird sein “Best Practices für die Arbeit mit SSIS &amp;amp; SSAS in komplexen und anspruchsvolleren Umgebungen”. Dabei werden wir uns 10 Ratschläge aus der Projektpraxis anschauen. Details zum Treffen findet Ihr auf &lt;a href="http://www.sqlpass.de"&gt;www.sqlpass.de&lt;/a&gt; unter der Regionalgruppe Hamburg. Freue mich möglichst viele von Euch auf dem Treffen zu sehen!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TXX5i4l26pI/AAAAAAAAARI/zsY1gmmoME8/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/TXX5j6cS7oI/AAAAAAAAARM/CoAOvmJB_SA/image_thumb%5B3%5D.png?imgmax=800" width="416" height="311" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-8602669575498725246?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8602669575498725246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8602669575498725246'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/03/best-practices-in-bi-projekten-vortrag.html' title='Best Practices in BI Projekten Vortrag auf dem SQL Server Usergroup Treffen in Hamburg (PASS)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/TXX5j6cS7oI/AAAAAAAAARM/CoAOvmJB_SA/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-545922370722797952</id><published>2011-03-04T22:32:00.001+01:00</published><updated>2011-03-04T22:32:56.942+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Eigenschaften eines SSIS Paketes mittels DTSProperty auslesen</title><content type='html'>&lt;div class="wlWriterHeaderFooter" style="float:right; margin:0px; padding:0px 0px 4px 8px;"&gt;&lt;script type="text/javascript"&gt;digg_url = "http://saschalorenz.blogspot.com/2011/03/eigenschaften-eines-ssis-paketes.html";digg_title = "Eigenschaften eines SSIS Paketes mittels DTSProperty auslesen";digg_bgcolor = "#F6F6F6";digg_skin = "normal";&lt;/script&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;digg_url = undefined;digg_title = undefined;digg_bgcolor = undefined;digg_skin = undefined;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;Heute noch schnell eine Antwort auf eine Frage aus der Community. &lt;/p&gt;  &lt;p&gt;In meinen “&lt;a href="http://www.sqlbits.com/Sessions/Event7/The_Developer_Side_of_the_Microsoft_Business_Intelligence_stack"&gt;The Developer Side of Microsoft Business Intelligence&lt;/a&gt;” Vorträgen verweise des Öfteren darauf, dass es möglich ist die Eigenschaften eines SSIS Paketes bzw. eines Taskhosts eines Paketes auszulesen. Hier meine übliche Folie dazu.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TXFacAEjqpI/AAAAAAAAAQ4/3q3m_IpAw_c/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TXFaeYbTMdI/AAAAAAAAAQ8/b7nucMM_soI/image_thumb%5B2%5D.png?imgmax=800" width="491" height="365" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nur wie können nun die Eigenschaften ausgelesen werden ohne, dass man weiß wie die Eigenschaften denn nun im Detail jeweils heißen?&lt;/p&gt;  &lt;p&gt;Da hilft mein bester Freund, die “foreach” Schleife, weiter! Und ein klein wenig müssen wir auch mit Try-Catch arbeiten.&lt;/p&gt;  &lt;p&gt;Hier der Code, um die grundlegenden Eigenschaften eines Paketes auszulesen:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;Microsoft.SqlServer.Dts.Runtime.Application app = new Microsoft.SqlServer.Dts.Runtime.Application(); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DialogResult result = openFileDialog1.ShowDialog();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if(result == DialogResult.OK)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Package p = app.LoadPackage(openFileDialog1.FileName, null);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (DtsProperty dp in p.Properties)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; try        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listBox2.Items.Add(dp.Name +&amp;quot; = &amp;quot;+ dp.GetValue(p).ToString());        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; catch        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listBox2.Items.Add(dp.Name + &amp;quot; &amp;lt;Error&amp;gt; &amp;quot;);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TXFafG9yswI/AAAAAAAAARA/hfVSbdc_58k/s1600-h/image%5B10%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TXFahIqapJI/AAAAAAAAARE/BAuUaHSuUbU/image_thumb%5B6%5D.png?imgmax=800" width="450" height="333" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Und so sieht das dann in meiner “offiziellen” Demo Anwendung aus. Hoffe doch sehr, dass hilft Euch bei Euren Dokumentationsprojekten weiter! Wenn nicht, dann einfach fragen.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-545922370722797952?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/545922370722797952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/545922370722797952'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/03/eigenschaften-eines-ssis-paketes.html' title='Eigenschaften eines SSIS Paketes mittels DTSProperty auslesen'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1gJtalph07w/TXFaeYbTMdI/AAAAAAAAAQ8/b7nucMM_soI/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-8844940095074259827</id><published>2011-03-02T17:25:00.001+01:00</published><updated>2011-03-02T17:25:58.328+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>März 2011 SQL Server Usergroup Treffen in Hamburg (PASS)</title><content type='html'>&lt;p&gt;Und schon wieder steht ein PASS Treffen vor der Tür! Nächste Woche (Mittwoch, den 9.3.2011) treffen wir uns wieder. Laut meinen letzten Infos treffen wir uns direkt in der Innenstadt. Der genaue Ort kommt mit der Einladung. Wie kommt Ihr an eine solche? Einfach auf &lt;a href="http://www.sqlpass.de"&gt;www.sqlpass.de&lt;/a&gt; für die RG Hamburg registrieren! :-)&lt;/p&gt;  &lt;p&gt;Dieses Mal bin ich mal wieder der Sprecher. Thema meines Community Vortrags wird sein “&lt;strong&gt;Best Practices für SSIS &amp;amp; SSAS in komplexen MS BI Umgebungen&lt;/strong&gt;”. Es werden sowohl technische Hinweise gegeben als auch Ratschläge für die Vorgehensweise in BI Projekten gegeben.&lt;/p&gt;  &lt;p&gt;Hoffe, dass viele von Euch die Zeit finden vorbei zu kommen!&lt;/p&gt;  &lt;p&gt;Des Weiteren bitte ich Euch den Abend des 21.3.2011 schon mal zu blocken. Denn dort ist ein Extra PASS Event in Hamburg geplant. Wir werden wieder mal Besuch von “Ausserhalb” bekommen und ein super Community Abend steht uns allen bevor! Details folgen wieder per Einladung.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-8844940095074259827?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8844940095074259827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8844940095074259827'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/03/marz-2011-sql-server-usergroup-treffen.html' title='März 2011 SQL Server Usergroup Treffen in Hamburg (PASS)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4945783453673880342</id><published>2011-02-26T10:44:00.001+01:00</published><updated>2011-02-26T10:44:53.294+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Was ist hier eigentlich installiert? SQL Server Versionen, Editionen etc. im Überblick</title><content type='html'>&lt;p&gt;Häufig treffe ich im Rahmen meines Jobs auf mir unbekannte SQL Server Installationen. Da macht es durchaus Sinn sich mal schnell einen groben Überblick über die installierten Instanzen, Versionen, Edition, Features etc. zu verschaffen. &lt;/p&gt;  &lt;p&gt;Wie kommt man nun schnell und einfach an diesen Überblick? Welche kryptische DMV hilft? :-)&lt;/p&gt;  &lt;p&gt;Es geht viel einfacher! Auf der SQL Server 2008 R2 DVD befindet das SQL Server-Installationscenter, welches nichts anderes ist als das SQL Server Setup. Das werden die meisten Leser schon mindestens einmal gesehen haben. Auf der linken Seite befindet sich ein Menü. Dort den Punkt Extras auswählen (im Englischen Tools). Nun kann der &lt;strong&gt;Bericht zur Ermittlung installierter SQL Server-Funktionen&lt;/strong&gt; aufgerufen werden.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TWjLZrCHCMI/AAAAAAAAAQo/bqLwaKNt9J8/s1600-h/image%5B13%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/TWjLcKX64NI/AAAAAAAAAQs/8kZUUuerbWk/image_thumb%5B7%5D.png?imgmax=800" width="668" height="500" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Es folgt der &lt;strong&gt;Microsoft SQL Server 2008 R2 Setup Discovery Report&lt;/strong&gt; ! Dieser zeigt übrigens auch Details über SQL Server 2000 &amp;amp; SQL Server 2005 Installationen an.&lt;/p&gt;  &lt;p&gt;Hier ein Beispiel:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TWjLffZ82RI/AAAAAAAAAQw/9OjED7FJLsQ/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/TWjLk2yz1cI/AAAAAAAAAQ0/0DX-xhm1cwY/image_thumb%5B1%5D.png?imgmax=800" width="945" height="541" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4945783453673880342?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4945783453673880342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4945783453673880342'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/02/was-ist-hier-eigentlich-installiert-sql.html' title='Was ist hier eigentlich installiert? SQL Server Versionen, Editionen etc. im Überblick'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/TWjLcKX64NI/AAAAAAAAAQs/8kZUUuerbWk/s72-c/image_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-2966909931973228577</id><published>2011-02-25T18:06:00.001+01:00</published><updated>2011-02-25T18:06:34.029+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Einsteiger'/><title type='text'>Coaches’ Hell: Wie entwickle ich denn jetzt so ein Vorgehensmodell für Microsoft Business Intelligence Projekte?</title><content type='html'>&lt;p&gt;&lt;a href="http://saschalorenz.blogspot.com/2011/02/coaches-diary-wie-verwende-ich-ssis.html"&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;Eine Lösung kann natürlich sein, sich einen entsprechenden Partner zu suchen, welcher ein fertiges Modell liegen hat. Grundsätzlich ein guter Plan! Eine Sache gebe ich aber zu bedenken bzw. mit auf den Weg. Ruhig mal fragen, ob die Kollegen denn mehr als ein Modell dabei haben. Wenn schon von der Stange, dann bitte auch in der richtigen Größe und Farbe kaufen. Nicht jedem passt ja schließlich jedes Modell!&lt;/p&gt;  &lt;p&gt;Und wenn man nun selbst drauf kommen muss! Was dann? Woher nehme ich meinen Kompass?&lt;/p&gt;  &lt;p&gt;Puh… weites Feld, gibt viel zu tun!&lt;/p&gt;  &lt;p&gt;Wie fängt man denn nun an? Es gibt eine Business Seite und eine Technik Seite. Da das hier ein SQL Server orientierter Blog ist, bleibe ich mal bei der technischen Seite. Und einigen wir uns kurz mal, dass die Einführung Projektmanagement auch übersprungen wird. :-)&lt;/p&gt;  &lt;p&gt;Was bleibt? Genau, fast zu viel! Zum Beispiel die Definition des Ziels bzw. der Modellierung eines Cubes. Immer ein super spannendes gruppendynamisches Erlebnis für die ganze Arbeitsgruppe! &lt;/p&gt;  &lt;p&gt;Ein Punkt, welcher Teilnehmer häufig weiterbringt, ist eine für sie verständliche Vorstellung des Ziels. Gerade für Einsteiger in das Thema BI sind Konzepte wie ein OLAP Cube doch recht abstrakt, oder? Da hilft für den Anfang dann eine vereinfachte Sicht auf die Dinge oft weiter. Das gilt besonders für Kollegen aus den kaufmännischen Abteilungen, welche spontan dem Projektteam zugeordnet wurden. Ihr seit uns herzlich willkommen!&lt;/p&gt;  &lt;p&gt;Nur wie kann man sich nun so einen Cube vorstellen? Anwender als auch Berater schauen sich dann gern in Excel einen fertigen Cube an. Ja, das ist das Endergebnis, welches in einer GUI aufbereitet vorliegt. Meiner Erfahrung nach kommen aber gerade Anwender von diesem Standort aus schwer auf die notwenige abstrakte Ebene. Da wird sich mit Händen und Füssen an Excel geklammert. Bringt keinen Spaß.&lt;/p&gt;  &lt;p&gt;Auch ein Sterndiagramm hilft hier meist nur bedingt weiter. Da es ja nun mal nicht wirklich einen Cube beschreibt, sondern die perfekte Quelle. Es muss eine Vorstellung des multidimensionalen Raums her.&lt;/p&gt;  &lt;p&gt;Ok, bei drei Achsen usw. ist das ja noch fast kein Problem. Dummerweise haben Cubes häufig wesentlich mehr Achsen, sprich Dimensionen. Ein Ansatz aus meinen Coachings ist, dass sich die Teilnehmer diesen doch bitte mal als ein mehrdimensionales Array vorstellen sollen. Was ist ein Array? Das kennen die jüngeren noch aus dem Programmierkurs in der Schule.&lt;/p&gt;  &lt;p&gt;Das hier &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Array[i] = Wert&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;wird vielen bekannt vorkommen. Ist ein eindimensionales Array. Das “Teil” hat einfach mehrere Schubladen, welche durchnummeriert sind und wir sagen über i welche Schublade es sein darf.&lt;/p&gt;  &lt;p&gt;Werden wir hiermit komplexer&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Array[x,y] = Wert .&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Das ist jetzt ein zweidimensionales Array. Ideal für einfache Koordinatensysteme.&lt;/p&gt;  &lt;p&gt;Wie kommen wir jetzt zum Cube?&lt;/p&gt;  &lt;p&gt;Das hier ist vereinfacht ausgedrückt ein Cube&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Cube[a&lt;sub&gt;1&lt;/sub&gt;,a&lt;sub&gt;2&lt;/sub&gt;,a&lt;sub&gt;3&lt;/sub&gt;,a&lt;sub&gt;4&lt;/sub&gt;,….a&lt;sub&gt;n&lt;/sub&gt;] = Wert .&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Jede Dimension in unserem Array steht nun für ein Attribut innerhalb des Cubes! Das lässt sich übrigens super am Flip Chart oder Whiteboard live entwickeln! :-)&lt;/p&gt;  &lt;p&gt;Warum jetzt Attribut? Weil, hier werden sich jetzt die Älteren von uns dran erinnern können, wir ab spätestens SQL Server Analysis Services 2005 von einem attributsorientierten OLAP Cube sprechen. Das Attribut steht im Vordergrund. Was ist ein Attribut? Eine Eigenschaft innerhalb einer Dimension. Zum Beispiel eine Produktnummer, eine Produktgruppe oder ein Produktsegment. Alles Beispiele für Attribute. Und diese Attribute haben Ausprägungen. Also zum Beispiel “Holzschrauben” und “Metallschrauben” als Produktgruppen.&lt;/p&gt;  &lt;p&gt;Wenn also a&lt;sub&gt;1 &lt;/sub&gt;die Produktgruppe ist und&lt;sub&gt; &lt;/sub&gt;a&lt;sub&gt;2 &lt;/sub&gt;die Produktnummer, dann sieht unser Array nun so aus&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Cube[Holzschrauben,4711-42,a&lt;sub&gt;3&lt;/sub&gt;,a&lt;sub&gt;4&lt;/sub&gt;,…a&lt;sub&gt;n&lt;/sub&gt;] = Wert &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Unsere a&lt;sub&gt;1 &lt;/sub&gt;&amp;amp; a&lt;sub&gt;2&lt;/sub&gt; beschreiben eine sehr sehr einfache Dimension Produkte. Und a&lt;sub&gt;3 &lt;/sub&gt;&amp;amp; a&lt;sub&gt;4 &lt;/sub&gt;sind einfach mal Dimension Zeit mit Jahr und Quartal.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Cube[Holzschrauben,4711-42,2011,Q1,…a&lt;sub&gt;n&lt;/sub&gt;] = Wert &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Schon bauen wir uns einen sehr einfachen Cube. Durch weitere Klammern, können wir nun noch die Dimensionen kenntlich machen. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Cube[ (Holzschrauben,4711-42) , (2011,Q1) ,…a&lt;sub&gt;n&lt;/sub&gt;] = Wert &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Denke mal, dass die Idee verstanden ist. Und was ist Wert? Unsere Measure? Nein! Hier werden wir gleich ein wenig technischer im Modell und weisen drauf hin, dass Measures ja am Ende auch “nur” eine Dimension sind. Also unsere a&lt;sub&gt;n&lt;/sub&gt; ist die Measure Dimension.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Cube[ (Holzschrauben,4711-42) , (2011,Q1) , Umsatz in Euro] = Wert &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Auf Basis dieses Modells können wir nun mit dem Würfel spielen. Zum Beispiel den Umsatz für eine andere Schraubenart abrufen.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Cube[ (Holzschrauben,0815-05) , (2011,Q1) , Umsatz in Euro] = Wert &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Und uns auch in der Zeit bewegen.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Cube[ (Holzschrauben,0815-05) , (2011,Q2) , Umsatz in Euro] = Wert &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Und auch andere Measures abfragen.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Cube[ (Holzschrauben,0815-05) , (2011,Q2) , Menge in Stück] = Wert &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Damit wird auch dem Laien im übrigen schnell deutlich, dass ein multidimensionaler Raum sehr wahrscheinlich recht dünn besiedelt ist. Hilft auch bei vielen Diskussionen! Glaubt mir!&lt;/p&gt;  &lt;p&gt;So, aber genug dazu. Damit stellt Ihr das Attribut in den Mittelpunkt. Wenn Ihr nun Eurer eigenes Vorgehensmodell definieren wollt oder müsst, dann orientiert Euch daran, dass Ihr die Attribute wirklich sauber definieren müsst. Sowohl für einen OLAP Cube als auch schon im Data Warehouse. Das ist natürlich einfach so dahin geschrieben. Es ist in Projekten oft eine echte Herausforderung! &lt;/p&gt;  &lt;p&gt;Mit den Cube = Array Modell kann aber zumindest relativ schnell über das Wesentliche diskutiert werden. Klar, jetzt fehlen noch ein paar Seiten Projektmanagement dazu. Des Weiteren macht häufig ein Reifegradmodell für eine saubere projektübergreifende Strategie Sinn.&lt;/p&gt;  &lt;p&gt;Ich hoffe mal, dass Euch dieser Kompass und die Dialogvorlage aus der Praxis ein klein wenig den Weg in Richtung Vorgehensmodell gewiesen hat. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-2966909931973228577?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2966909931973228577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2966909931973228577'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/02/coaches-hell-wie-entwickle-ich-denn.html' title='Coaches’ Hell: Wie entwickle ich denn jetzt so ein Vorgehensmodell für Microsoft Business Intelligence Projekte?'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-7308343836391180298</id><published>2011-02-23T18:45:00.001+01:00</published><updated>2011-02-23T18:45:35.778+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Projektmanagement'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Coaches’ Diary: Wie verwende ich SSIS &amp; SSAS in Business Intelligence Projekten mit dem SQL Server denn nun wirklich richtig?</title><content type='html'>&lt;p&gt;Eine Frage höre ich im Verlauf von Coachings und Workshops immer wieder: &lt;/p&gt;  &lt;p&gt;„Wie setzen wir denn nun die Werkzeuge bzw. die Dienste rund um den SQL Server wirklich richtig ein?“&lt;/p&gt;  &lt;p&gt;Häufig stehen dabei die Werkzeuge wie das SSMS und das BIDS im Kontext von Business Intelligence Projekten im Vordergrund.&lt;/p&gt;  &lt;p&gt;Es geht um die klassische Frage: Was ist richtig, was ist falsch? Und schon wird es alles andere als einfach!&lt;/p&gt;  &lt;p&gt;Die Verantwortlichen in den Unternehmen für BI Projekte möchten nach Möglichkeit schnell zum Ziel kommen. Möglichst wenig Schleifen fliegen müssen. Zeit und damit Geld soll möglichst wenig verbrannt werden. Idealerweise soll schon vor dem Start klar sein wo, wann und wie die Ladung stattfindet und was während des Fluges so alles gereicht wird. Alles äußerst löbliche Ziele für ein Projekt! Wenn da das „aber“ nicht wäre.&lt;/p&gt;  &lt;p&gt;Genaugenommen ist unser „aber“ hier ein „Randbedingungen“. &lt;/p&gt;  &lt;p&gt;Jedes Projekt hat Randbedingungen. Und jeder Kunde definiert diese anders. Dazu kommt, dass diese Definition in den seltensten Fällen ein zu 100% bewusster Prozess ist.&lt;/p&gt;  &lt;p&gt;Die Randbedingungen in Projekten bestimmen in der Regel, was sich später als falsch oder richtig herausstellen wird. Genau, das wird auch erst später deutlich! Dabei müssen doch jetzt Entscheidungen getroffen werden. Idealerweise noch vor dem Start eines Projektes! Und schon sind wir in der Schublade mit den Herausforderungen des klassischen Projektmanagements gelandet. Ein wenig muffig hier.&lt;/p&gt;  &lt;p&gt;Wie kommen wir hier wieder raus? &lt;/p&gt;  &lt;p&gt;Reduzieren wir das Ganze doch erst mal auf den technischen Aspekt. Technik wird sich ja wohl nur richtig oder falsch anwenden lassen, oder? Das trifft auf viele technische Werkzeuge zu. Bestimmt auch auf die eine oder andere Software, vielleicht sogar auf einige BI Lösungen. Nur bestimmt nicht auf den Business Intelligence Stack von Microsoft.&lt;/p&gt;  &lt;p&gt;Der Microsoft BI Stack ist ein ehrlicher und gut ausgestatteter Werkzeugkasten, welcher keine falsche Versprechungen macht. Mittlerweile zieht der Vergleich mit dem Werkzeugkasten auch nicht mehr, eigentlich müssten wir hier schon von einem ganzen Schrank sprechen. Nehmen wir zum Beispiel auch noch die SharePoint Welt mit auf, dann sind wir sinnbildlich schon fast bei einer ganzen Garage. Und wurden in diesen nicht die innovativsten Lösungen entwickelt? Aber wir schweifen ab.&lt;/p&gt;  &lt;p&gt;Was ist denn nun richtig oder falsch? Hier möchte ich kurz das Bild des Golfers bemühen. Ja, genau diese Gattung Mensch, welche einen kleinen Ball mit einem teilweise wirklich nicht ergonomischen Schläger in einem unübersichtlichem Gelände in ein viel zu kleines Loch befördern möchte. Wenn man es genau bedenkt, dann ist der Vergleich zum BI Projekt gar nicht so weit, oder? Und diese Golfer nehmen Stunden bei Golftrainern. So weit, so gut. Nun ist es aber so, dass es beim Golfen kein falsch oder richtig gibt. Wie kommst? Da steht nun der ehrgeizige Golfer. Möchte seinen Schlag verbessern, was in der Regel bedeutet, weiter und öfter mal dahin wo er ihn hinhaben will. Der Trainer gibt Tipps. Mehr Gewicht nach links, weniger das Handgelenk bewegen usw. Was passiert beim ersten Schlag? Geht völlig quer. Warum? Weil der letzte Trainer, den man hatte, genau das Gegenteil geraten hat. Mehr Gewicht nach rechts, Schwung aus der Schlägerhaltung usw. Wer hat nun Recht? Das fragt sich unser Golfer und zahl ein wenig zerknirscht die Trainerstunde. Beide Trainer schlagen im Übrigen total tolle Bälle und haben ein traumhaftes Handicap. Sie haben jeweils ihren eigenen Stil beim Abschlag und diesem bleiben sie treu. Wir könnten hier auch von einem Plan sprechen. Und wer sich mal mit einem professionellen Golfer unterhalten hat, der bekommt auch eine Impression davon wie komplex dieser Plan sein kann. Und wenn wir nun munter zwischen diesen Stilen bzw. Plänen wechseln, nun ja, klar, dass es uns da den Abschlag verhagelt. Angeblich erkennt man einen guten Golftrainer auch daran, dass er nicht versucht dem Golfer seinen Stil aufzudrücken, sondern bestrebt ist die vorhandene Technik zu verbessern. &lt;/p&gt;  &lt;p&gt;Also gibt es kein richtig oder falsch. Nur ein “passt zum Plan” oder “passt nicht zum Plan”! Was ist nun in unserem BI Projekt der Plan? Nennen wir es mal Konzept.&lt;/p&gt;  &lt;p&gt;Und was lernen wir da draußen an der Projektfront? Eine deutliche Unterschätzung bzw. Abwertung von klassischen konzeptionellen Phasen. Mitunter kommt sogar das Gefühl auf, dass „das Konzept“ bereits ein Unwort geworden ist. Alles muss mittlerweile pragmatisch und agil sein. Nicht, dass diese Ansätze falsch wären, aber auch hier ist ein mehr oder weniger klar definiertes Ziel von Vorteil.&lt;/p&gt;  &lt;p&gt;Aber kommen wir zur Ausgangsfrage zurück: Wie verwende ich SSIS &amp;amp; SSAS denn nun richtig?&lt;/p&gt;  &lt;p&gt;Unterscheiden wir mal zwischen allgemeinen Best Practices, welche sich um Performance Fragen drehen, und Architekturen, welche das Gesamtbild der späteren Lösung entscheidend bestimmen.&lt;/p&gt;  &lt;p&gt;Best Practices gibt es mittlerweile viele. Und die meisten sind auch in den häufigsten Fällen allgemein genug, um sie fast immer anzuwenden.&lt;/p&gt;  &lt;p&gt;Kommen wir zur Architektur. Hier stellt sich die Frage: Wie viel Feenstaub darf es denn sein?&lt;/p&gt;  &lt;p&gt;Hier hilft eine klare und möglichst realistische Vorstellung des Ziels deutlich weiter. Klare Antworten auf Fragen wie „Wer arbeitet später mit dem System?“ oder „Wie viele arbeiten später damit?“. Auch immer gern im Vorwege gewusst: „Warum arbeiten die überhaupt damit?“. Viel zu häufig wird davon ausgegangen, dass das doch klar ist. Fragen lohnt sich hier auf jeden Fall. Allein schon der Antworten wegen.&lt;/p&gt;  &lt;p&gt;Ok, Versuch es auf den Punkt zu bringen. :^)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Der Microsoft BI Stack ist eine erwachsende Umgebung, welche neben einer gewissen technischen Expertise auch einen belastbaren Plan benötigt, um ans Ziel zu kommen!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Dieser Plan darf durchaus mehrstufig sein. Ich mag ja die Worte Grob- und Feinkonzept kaum schreiben.&lt;/p&gt;  &lt;p&gt;Des Weiteren ist es in Projekten gar nicht so unüblich, dass Entscheidungen unterwegs mal zurückgenommen werden. Alles gut, ehrlich. Es muss nur in geordneten Bahnen verlaufen. Viel zu häufig wird Projektmanagement mit dem Abarbeiten eines unveränderlichen Plans verwechselt. &lt;/p&gt;  &lt;p&gt;Es gibt eine ganze Reihe von Randbedingungen, welche für die Auswahl der jeweiligen Methode, Vorgehensweise, Vorgangs- und Reifegradmodells berücksichtigt werden müssen. &lt;/p&gt;  &lt;p&gt;Hier ein paar Tipps aus der Coaching Praxis:&lt;/p&gt;  &lt;p&gt;Stellt Euch die Frage, welche Entscheidungen getroffen werden müssen. Das fängt schon mit der Wahl der SQL Edition an. Entwickelt im Dialog einen Entscheidungsbaum, welcher die jeweiligen Entscheidungen beinhaltet. Dokumentiert damit, welche Auswirkungen auf ein Projekt die jeweilige Entscheidung hat. Visio hilft hier gern.&lt;/p&gt;  &lt;p&gt;Spiegelt an diesem Entscheidungsbaum später Eure Anforderungen. Also so etwas wie 24x7 Betrieb oder auch near-real time latency der Daten. Natürlich ist auch das erwartete Datenvolumen wichtig. Sprechen wir über 80 GB oder 8 TB? Der SQL Server kann beides stemmen. Nur der Weg ist halt ein anderer. &lt;/p&gt;  &lt;p&gt;Berücksichtigt die Rahmenbedingungen des Projektes. Also zum Beispiel: Wie viele Berater sollen, müssen oder können parallel was zum Erfolg beitragen? Die Antwort ist meist erschreckend. &lt;/p&gt;  &lt;p&gt;Bei uns kommt zum Beispiel noch die Frage dazu, ob wir in dem Projekt mit Repositories für SSIS &amp;amp; SSAS arbeiten oder nicht. Das passt auch nicht immer.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Wir sehen, dass der Plan (und ja, ich nenne es Konzept) den Einsatz der Werkzeuge bestimmt und nicht umgekehrt.&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;„It depends!“&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;(Alte Beraterweisheit, welche sicherlich schon beim Bau der Pyramiden ein alter Hut war.)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-7308343836391180298?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7308343836391180298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7308343836391180298'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/02/coaches-diary-wie-verwende-ich-ssis.html' title='Coaches’ Diary: Wie verwende ich SSIS &amp;amp; SSAS in Business Intelligence Projekten mit dem SQL Server denn nun wirklich richtig?'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-3560955130883078710</id><published>2011-02-06T13:08:00.001+01:00</published><updated>2011-02-06T13:08:26.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLBits'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Veröffentlichungen'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Analysis Services Scale-out Vortrag auf der SQLBits 8 in Brighton, UK</title><content type='html'>&lt;p&gt;Wie die Zeit doch rennt! Gerade erst wurde auf der SQLBits Site &lt;a href="http://www.sqlbits.com/Speakers/Sascha_Lorenz"&gt;mein Vortrag von der SQLBits 7 Konferenz als Video&lt;/a&gt; veröffentlicht, schon gibst die SQLBits 8 ! Die Engländer geben da echt Gas.&lt;/p&gt;  &lt;p&gt;Und ich bin stolz berichten zu dürfen, dass ich wieder als Sprecher dabei sein darf! Bin wieder als Sprecher für den Freitag ausgewählt worden. Ihr wisst ja noch, dass die SQLBits Konferenz aus drei Tagen besteht:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Pre Conference full day training seminars&lt;/li&gt;    &lt;li&gt;Pay Friday (content is hand picked) &amp;lt;- da bin ich bei… :-)&lt;/li&gt;    &lt;li&gt;free Community Saturday&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Dieses Mal darf ich von meinen Erfahrungen mit Scale-Out Szenarien mit Analysis Services (und ein wenig SSIS) berichten. Weiter unten ist mein Abstract für die Session. &lt;/p&gt;  &lt;p&gt;Wie ich ja schon mal geschrieben habe: Die SQLBits Konferenzen lohnen sich auf jeden Fall für jeden SQL Server Pro! UK ist günstig zu erreichen und man mal gar nicht mehr so teuer wie früher. Daher, kommt vorbei und besucht die SQLBits! Vielleicht kommen die Deutschen vor Ort dieses Mal sogar in den zweistelligen Bereich. Ich freu mich drauf! &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;28 Weeks later - How to scale-out your MS Business Intelligence environment     &lt;br /&gt;&lt;/strong&gt;This session will demonstrate possibilities to scale-out your existing Microsoft Business Intelligence environment. The SQL Server provides much functionality that increases the scalability and flexibility of your solution by distributing data and jobs among low-priced commodity servers.     &lt;br /&gt;We will explore the ways how to use link dimensions, link measure groups and remote-partitions in Analysis Services. With the approach of synchronization and load balancing we can increase the high availability of the service.    &lt;br /&gt;We also take a close look on the Shared Scalable Database feature and how to use your SAN environment wisely.     &lt;br /&gt;This session will demonstrate an approach how to use Analysis Management Objects (AMO) to manage our scalable environment very flexible and without much pain.     &lt;br /&gt;But wait, there's much more, because our ETL Jobs also need assistance to scale out. This session will provide an approach to build an alternative decentralized SSIS scheduling system. This approach is also cloud ready!    &lt;br /&gt;This session delivers many samples and source code to demonstrate the approaches.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TU6PNbt6nMI/AAAAAAAAAQc/cpDoIShte2s/s1600-h/SQLBitsLogo%5B1%5D%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="SQLBitsLogo[1]" border="0" alt="SQLBitsLogo[1]" src="http://lh5.ggpht.com/_1gJtalph07w/TU6POH0unQI/AAAAAAAAAQg/rqN-JkfEM7M/SQLBitsLogo%5B1%5D_thumb%5B2%5D.png?imgmax=800" width="240" height="81" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-3560955130883078710?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3560955130883078710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3560955130883078710'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/02/analysis-services-scale-out-vortrag-auf.html' title='Analysis Services Scale-out Vortrag auf der SQLBits 8 in Brighton, UK'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1gJtalph07w/TU6POH0unQI/AAAAAAAAAQg/rqN-JkfEM7M/s72-c/SQLBitsLogo%5B1%5D_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-2716461340697503545</id><published>2011-01-27T12:21:00.001+01:00</published><updated>2011-01-27T12:21:07.686+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Der MSDN Tour Bus kommt nach Hamburg und besucht die SQL Server Community PASS!</title><content type='html'>&lt;p&gt;Hier schon mal die ersten Infos zum MSDN Tour Bus Stopp in Hamburg.&lt;/p&gt;  &lt;p&gt;Wie ja schon einige von Euch mitbekommen haben, ist es uns gelungen genau an unserem Community Abend, dem &lt;strong&gt;10.02.2011&lt;/strong&gt;, den MSDN Tour Bus in unsere schöne Stadt zu bekommen! Vielen Dank dafür an all die Community Feen und Elfen bei Microsoft und den Agenturen! Wir führen den Stopp in Kooperation mit der wiedererwachten .net Usergroup in Hamburg durch! Super Jungs (und Mädels?), dass Ihr wieder aktiver seit!&lt;/p&gt;  &lt;p&gt;Der Bus wird laut der aktuellen Planung gegenüber der Microsoft Niederlassung in Hamburg stehen. Also sehr gut mit allen Verkehrsmitteln zu erreichen. Die SQL Server Community PASS Deutschland e.V. Hamburg hat den Bus exklusiv von &lt;strong&gt;17 Uhr bis 19 Uhr&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Hier der offizielle Text von MS dazu:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;MSDN, das &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/de-de/"&gt;&lt;em&gt;&lt;font color="#000000"&gt;Microsoft Developer Network&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, geht mit hochwertigen Vorträgen zu aktuellstem Entwicklerwissen im technikbeladenen, komfortablen MSDN-Bus auf Deutschland-Tour und macht auch in Ihrer Nähe Halt.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Nutzen Sie als Entwickler die Möglichkeit, im MSDN-Bus direkt von Microsoft-Referenten das Neueste aus der Softwareentwicklung zu erfahren und aktuelle Technik hautnah erleben zu können. Sei es &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/de-de/vstudio"&gt;&lt;em&gt;&lt;font color="#000000"&gt;Visual Studio 2010&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/de-de/ff380144.aspx"&gt;&lt;em&gt;&lt;font color="#000000"&gt;Web-Entwicklung&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; und &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/de-de/ie/aa740471.aspx?ocid=soc-n-de-ie9--de"&gt;&lt;em&gt;&lt;font color="#000000"&gt;Internet Explorer 9&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, Cloud-Dienste wie &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/de-de/windowsazure/"&gt;&lt;em&gt;&lt;font color="#000000"&gt;Windows Azure&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, das &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/de-de/security"&gt;&lt;em&gt;&lt;font color="#000000"&gt;Schreiben von sicherem Code&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; oder eines vieler weiterer Themen, etwa &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/de-de/windowsphone"&gt;&lt;em&gt;&lt;font color="#000000"&gt;Windows Phone 7&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; oder &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/de-de/openspecifications/default.aspx"&gt;&lt;em&gt;&lt;font color="#000000"&gt;Open Source &amp;amp; Standards&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; bei Microsoft. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Im Umfeld zahlreicher Demos, How-To-Anleitungen und Sourcecodes können Sie mit Microsofts Experten und Gleichgesinnten fachsimpeln und netzwerken. Außerdem zeigen wir Ihnen, welche &lt;/em&gt;&lt;a href="http://msdn.microsoft.com/de-de/willkommen.aspx"&gt;&lt;em&gt;&lt;font color="#000000"&gt;Services und Programmatiken&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;em&gt; MSDN für Sie anbietet. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Bitte beachtet, dass es sich um eine &lt;strong&gt;Geschlossene Veranstaltung&lt;/strong&gt; handeln wird. Daher dieses Mal besonders auf die Einladung vom Rolf achten und sich registrieren, da wir verhindern wollen, dass jemand bei dem Wetter draußen stehen muss. &lt;/p&gt;  &lt;p&gt;Wir werden Euch über die weiteren Details wie Themen und MS Speaker auf dem Laufenden halten!&lt;/p&gt;  &lt;p&gt;Hier findet Ihr erste Infos, Karte und Bilder: &lt;a title="http://www.msdn-on-tour.de/Details1002.aspx" href="http://www.msdn-on-tour.de/Details1002.aspx"&gt;http://www.msdn-on-tour.de/Details1002.aspx&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-2716461340697503545?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2716461340697503545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2716461340697503545'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/01/der-msdn-tour-bus-kommt-nach-hamburg.html' title='Der MSDN Tour Bus kommt nach Hamburg und besucht die SQL Server Community PASS!'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-8569876288476088547</id><published>2011-01-26T15:55:00.001+01:00</published><updated>2011-01-26T15:55:31.036+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server asynchrone Trigger &amp; Service Broker im Repository</title><content type='html'>&lt;p&gt;Da schreibe ich über unsere Repositories und schon gibst Schimpfe aus der Community! Sascha hat gesagt, dass er Trigger einsetzt… geht ja man mal gar nicht! So von wegen schlechtes Vorbild und so! Trigger sind doch so was von bööööööööse…… kommen gleich nach Cursorn! :-)&lt;/p&gt;  &lt;p&gt;Recht habt Ihr! Grundsätzlich in einer LOB / OLTP Umgebung bin ich sehr selten ein Fan von Triggern. Wobei ich diese Diskussion immer wieder mit ISVs führen muss. Daher hier jetzt mal ein paar Worte dazu…&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Warum sind Trigger eigentlich böse? Sind doch ne coole Sache, oder?      &lt;br /&gt;&lt;/strong&gt;Ja, Trigger sind von der Idee her sogar äußerst praktisch. Logik wird ausgelöst durch ein DML oder DDL Statement. Es muss nicht extra eine Prozedur gestartet werden. Das unerfreulich an einem Trigger ist die Tatsache, dass er out-of-the-box immer synchron ist. Das geht leider ganz gewaltig zu Kosten der Gesamtperformance eines Systems, wenn da ein wenig mehr Last drauf kommt. Damit ist gemeint, dass die Aktion, welche der Trigger startet, immer GENAU in dem Moment “passiert”, in welchem der Trigger aufgerufen wird. Das macht in einigen Bereichen durchaus Sinn, aber in den meisten Fällen ist diese 100% Synchronität nicht notwendig. Zum Beispiel in fast all meinen Repository Beispielen. Daher verwenden wir so genannte asynchrone Trigger!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ok, was sind denn jetzt bitte asynchrone Trigger?     &lt;br /&gt;&lt;/strong&gt;Mit asynchronen Triggern meinen wir in der Regel einen Trigger, welcher einen Service Broker Service (Service ist immer wichtig…) nutzt! Service Broker führt leider in sehr vielen Umgebungen ein Schattendasein, obwohl es jedem, wirklich &lt;strong&gt;JEDEM&lt;/strong&gt;, SQL Server seit 2005 “beiliegt”. (Ok, von kleinen Einschränkungen mal abgesehen.) Und Trigger sind, neben vielen anderen, ein sehr gutes Beispiel für den produktiven und überhaupt nicht esoterischen Einsatz von Service Brokern!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Und was ist dieser “Service Broker”? Und brauche ich dafür eine Enterprise Edition?     &lt;br /&gt;&lt;/strong&gt;Hier kommt ein wenig Text aus der BOL:&lt;strong&gt; “&lt;/strong&gt;&lt;em&gt;Service Brokerunterstützt Datenbankentwickler beim Erstellen zuverlässiger und skalierbarer Anwendungen. Da Service Broker Teil von Database Engine (Datenbankmodul) ist, ist auch die Verwaltung dieser Anwendungen Teil der routinemäßigen Verwaltung der Datenbank.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Service Broker stellt für SQL Server Queuing und zuverlässiges Messaging bereit. Service Broker wird für Anwendungen verwendet, die eine einzige Instanz von SQL Server verwenden, sowie für Anwendungen, die Arbeit über mehrere Instanzen verteilen.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Innerhalb einer SQL Server-Instanz stellt Service Broker ein leistungsfähiges asynchrones Programmierungsmodell bereit. Datenbankanwendungen verwenden normalerweise asynchrone Programmierung, um die interaktive Antwortzeit zu verkürzen und den Anwendungsdurchsatz allgemein zu erhöhen.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Außerdem bietet Service Broker zuverlässiges Messaging zwischen SQL Server-Instanzen. Service Broker unterstützt Entwickler beim Konzipieren von Anwendungen aus unabhängigen, eigenständigen Komponenten, den so genannten Diensten. Anwendungen, die die über diese Dienste bereitgestellte Funktionalität benötigen, verwenden für die Interaktion mit den Diensten Nachrichten. Service Broker verwendet TCP/IP für den Austausch von Nachrichten zwischen Instanzen. Service Broker enthält Features, die den nicht autorisierten Zugriff über das Netzwerk verhindern helfen und über das Netzwerk gesendete Nachricht verschlüsseln.”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Das liest sich für viele Entwickler äußerst spannend, aber leider häufig auch ein wenig weit weg von ihren täglichen Herausforderungen! Dem ist aber gar nicht so! Daher, gebt dem Service Broker eine Chance! Bald wollt Ihr nicht mehr ohne! –&amp;gt; “Service Broker” gefällt mir!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-8569876288476088547?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8569876288476088547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8569876288476088547'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/01/sql-server-asynchrone-trigger-service.html' title='SQL Server asynchrone Trigger &amp;amp; Service Broker im Repository'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-3200765514898881834</id><published>2011-01-24T08:58:00.001+01:00</published><updated>2011-01-24T08:58:10.335+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Repository driven BI'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Wieder einmal das Repository… oder auch Repository driven BI / everything in SQL Server FAQ…</title><content type='html'>&lt;p&gt;Auf Repositorys und Meta Daten komme ich ja immer wieder gerne zu sprechen. :^)&lt;/p&gt;  &lt;p&gt;Zuletzt hatte ich die Gelegenheit meine Ideen von Repository getriebenen Architekturen einer Community in Nürnberg, in der &lt;a href="http://saschalorenz.blogspot.com/2011/01/repository-driven-sql-server-business.html"&gt;PASS Regionalgruppe Franken&lt;/a&gt;, vorzustellen. Vielen Dank an den Klaus Oberdalhoff für die Organisation dieses Events und vielen Dank an die Raumsponsoren! Kommt gar nicht so häufig vor, dass ich bei einem RG Treffen vor mehr als 40 Teilnehmern spreche. Kam fast ein wenig Konferenzstimmung auf. Des Weiteren war die Session schön interaktiv und es wurden einige sehr gute Fragen gestellt. &lt;/p&gt;  &lt;p&gt;Ein paar dieser Fragen und natürlich die Antworten hier nun für den Online Teil der Community. Fragen folgen in Fett.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Ein wesentlicher Teil der Fragen zielte darauf ab, was denn nun so ein Repository ausmache bzw. ob das nichts anderes ist als eine Konfiguration?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Zwar bauen meine Ansätze immer auf einem Repository auf, welches die beschreibenden Daten für die eigentliche Zielplattform hält, aber es handelt sich dabei nicht nur um eine andere Organisationsform einer Konfigurationsdatei für eine existierende Technologieplattform!&lt;/p&gt;  &lt;p&gt;Ich vergleiche das gerne mit einem Navigationsgerät. Technologie ist klar, das gute Stück kann sich super orientieren und mit ein wenig Kartenzauber und Routenfindung äußerst praktisch. Nur wie verwenden wir es? Wir geben in der Regel die Route nicht im Detail vor, also jede Straße, jede Kreuzung usw. Wir kommunizieren über eine Metaebene mit der eigentlichen Logik, welche eine für uns plausible Information abfragt: Eine Zieladresse. Die restliche Magie findet auf sehr wahrscheinlich mehreren Ebenen darunter statt. Der letzte Level kennt den aktuellen Standort und kommuniziert wiederum mit dem Routenplaner eine Etage über ihm, usw. Also ist das Adressbuch eine Metaebene (-&amp;gt; Repository) und auch das Kartenmaterial (noch eine Ebene).&lt;/p&gt;  &lt;p&gt;Daher ist ein wesentlicher Aspekt des Ansatz, dass es mir NICHT allein um das an-codieren der SQL Server Funktionen geht, sei es nun SMO oder AMO. Die eigentliche Magie spielt sich meiner Meinung nach in den Ebenen darüber ab. Denn in diesen Ebenen werden erweiterte Funktionalitäten hinzugefügt. Ein bei mir sehr beliebtes Muster (ich sage mal absichtlich nicht Pattern, das führt nur zu Missverständnissen) ist das Hinzufügen der Möglichkeit Objekte zu Gruppen zusammenzufassen, was in der Regel auf der Zielplattform nicht möglich bzw. nicht “Solution” übergreifend anwendbar ist.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Beispiele für Ziel- bzw. Technologieplattformen&lt;/strong&gt; können sein: SQL Server Analysis Services (SSAS), SQL Server Integration Services (SSIS), SQL Server Replikation, Trigger, Service Broker, Extended Events oder auch SharePoint. &lt;/p&gt;  &lt;p&gt;Und Beispiele für Gruppen können damit sein: &lt;/p&gt;  &lt;p&gt;- Attribute in SSAS Projekten, aber über mehrere Dimension und auch Solutions hinweg.    &lt;br /&gt;- Steuerung von Triggern bzw. asynchronen Triggern, welche auch noch mit Service Broker Diensten verbunden sind.     &lt;br /&gt;- Abonnenten innerhalb einer Replikationsstruktur können sehr gut zu Gruppen zusammengefasst werden, um diese mittels eines Eintrags im Repository an einen anderen Verteiler “zu hängen”. Glaubt mir, sowas macht in schön großen Replikationsstrukturen (&amp;gt;200 Abonnenten) und 1-2 mehr Servern richtig Spaß!    &lt;br /&gt;- Listen und was alles damit zusammenhängt (hehe…) innerhalb von SharePoint. Damit lassen sich auch schöne Projekte realisieren, aber sprengt gerade den Rahmen hier.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Wie steuere ich das dann alles von oben?&lt;/strong&gt; In der Regel durch eine &lt;a href="http://de.wikipedia.org/wiki/Dom%C3%A4nenspezifische_Sprache"&gt;domänenspezifische Sprache,&lt;/a&gt; wobei ich gerne noch weiter gehen möchte und das einfach mal projektspezifische Sprache (PSL) nenne. Also hier drin steckt meiner Meinung nach die eigentliche Magie (ich mag das Wort in dem Zusammenhang) in den Projekten.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Wie komme ich auf sowas?&lt;/strong&gt; Schon sehr früh, noch zu Zeiten als ich mit Clipper (und es war Sommer 87…*flöt*) und MUMPS unterwegs war, habe ich mir Codegeneratoren entwickelt, welche zum Beispiel das damalige Clipper (vor dem CA Zeug) um die Möglichkeit von eigenen Klassen erweitert haben. Sowas prägt fürs ganze IT-Leben! by the way, Dank an den Jan Welker für den Tipp mit T4! Äußerst spannend!&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Wie speichere ich das Repository?&lt;/strong&gt; Schwieriges Thema… gerne als einfache relationale Struktur. Dann kann mittels SQL DML Befehlen direkt darauf eingewirkt werden und auch evtl. notwendige GUIs brauchen “nur” SQL DML beherrschen. Damit auch mal was passiert in den Strukturen kommen da dann ausnahmsweise Trigger dazu, welche auf Veränderungen reagieren. Die Daten im Repository bildet dann die Strukturen auf der jeweiligen Zielplattform ab.&lt;/p&gt;  &lt;p&gt;So, damit sind die wohl häufigsten Fragen persistiert worden. Bei weiteren Fragen einfach auf mich zukommen!&lt;/p&gt;  &lt;p&gt;Für Alle, die die Session &lt;a href="http://www.sqlbits.com/Sessions/Event7/The_Developer_Side_of_the_Microsoft_Business_Intelligence_stack"&gt;Repository Driven Business Intelligence aka The Developer Side of MS BI&lt;/a&gt; bisher nicht gesehen haben, die gibt es als englischen Cast auch noch auf den SQLBits Seiten! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-3200765514898881834?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3200765514898881834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3200765514898881834'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/01/wieder-einmal-das-repository-oder-auch.html' title='Wieder einmal das Repository… oder auch Repository driven BI / everything in SQL Server FAQ…'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-8483179262905154137</id><published>2011-01-10T17:17:00.001+01:00</published><updated>2011-01-10T17:17:24.388+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Repository driven SQL Server Business Intelligence Vortrag in der Region Franken ( Nürnberg / Fürth )</title><content type='html'>&lt;p&gt;In der nächsten Woche am 18.01.2011 halte ich in der Community &lt;a href="http://www.sqlpass.de/Regionen/Deutschland/Franken/tabid/71/Default.aspx"&gt;PASS Deutschland e.V. Regionalgruppe Franken&lt;/a&gt; in Nürnberg meinen “Einsteiger&amp;quot; Vortrag zum Thema Repository driven Business Intelligence mit dem SQL Server:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Developer Side of Microsoft Business Intelligence&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Der Microsoft SQL Server bietet eine ganze Reihe von äußerst mächtigen Diensten und Werkzeugen für die Erstellung von Business Intelligence Lösungen. Warum sollte sich dann überhaupt ein BI Berater mit den Möglichkeiten der Programmierbarkeit des SQL Servers beschäftigen? Weicht er damit nicht vom Standard ab? Und warum sollte sich ein Programmierer mit BI befassen? Sind die BI relevanten Dienste vom SQL Server etwa nicht fertig? &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Die Wahrheit ist, dass eine wesentliche Stärke des SQL Servers, neben den bekannten Werkzeugen, die Verfügbarkeit von diversen sehr gut dokumentierten APIs ist. Diese APIs können sehr gut im Rahmen von BI Projekten genutzt werden und die Integrationsfähigkeit einer BI Lösung um ein vielfaches erhöhen. Alle in diesem Workshop vorgestellten Schnittstellen sind offiziell von Microsoft beschrieben worden und werden in zukünftigen Versionen unterstützt werden. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Vor dem Einsatz von Technologie kommt aber immer die zielgerichtete Konzeption der Lösung. Es wird gezeigt, wann und wie sich der Einsatz von Programmierung in BI Projekten tatsächlich rechnet und welche Voraussetzungen dafür erfüllt sein müssen.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ein ganz wesentlicher Punkt aus der Erfahrung heraus ist die Nutzung der Abstraktion der Anforderungen und der Technologie als Architekturansatz im Design von Business Intelligence Lösungen.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Es werden sowohl Analysis Services, Integration Services als auch die relationale Engine untersucht und entsprechend mit einem Repository angesteuert und genutzt.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Details zum Treffen findet Ihr hier:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.sqlpass.de/Regionen/Deutschland/Franken/tabid/71/Default.aspx" href="http://www.sqlpass.de/Regionen/Deutschland/Franken/tabid/71/Default.aspx"&gt;http://www.sqlpass.de/Regionen/Deutschland/Franken/tabid/71/Default.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="https://www.xing.com/events/developer-side-of-microsoft-business-intelligence-665284" href="https://www.xing.com/events/developer-side-of-microsoft-business-intelligence-665284"&gt;https://www.xing.com/events/developer-side-of-microsoft-business-intelligence-665284&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Würde mich freuen möglichst viele von Euch dort aus der Community kennenzulernen!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-8483179262905154137?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8483179262905154137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8483179262905154137'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/01/repository-driven-sql-server-business.html' title='Repository driven SQL Server Business Intelligence Vortrag in der Region Franken ( Nürnberg / Fürth )'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-2889578182197974146</id><published>2011-01-02T18:04:00.001+01:00</published><updated>2011-01-02T18:04:32.934+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Frohes neues Jahr 2011 !</title><content type='html'>&lt;p&gt;Wow, es ist schon 2011! Wie die Zeit doch vergeht. Hoffe Ihr seit alle gut reingekommen!&lt;/p&gt;  &lt;p&gt;Die letzten Monate des Jahres waren wieder sehr arbeitsreich und so geht es auch gleich weiter… aber ich habe diverses organisiert bekommen in Sachen Community Arbeit! Daher bin ich mir recht sicher, dass es 2011 einiges Neues für die Community auf diesem Kanal geben wird!&lt;/p&gt;  &lt;p&gt;Aber erst mal zu den akutellesten Terminplanungen für 2011. Ist zwar noch früh, aber die ersten Termine stehen schon:&lt;/p&gt;  &lt;p&gt;Bereits am &lt;strong&gt;18.1.2011 &lt;/strong&gt;bin ich als Redner zu Gast in der &lt;strong&gt;SQL PASS Regionalgruppe Franken (Nürnberg)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;und am &lt;strong&gt;16.5.2011&lt;/strong&gt; bin ich als Redner in der &lt;strong&gt;SQL PASS Regionalgruppe Köln/Bonn&lt;/strong&gt; dabei.&lt;/p&gt;  &lt;p&gt;Des Weiteren findet vom 7. bis zum 9.4.2011 die SQL Server Konferenz SQLBits 8 in Brighton, UK statt. Immer für einen Besuch gut! Und wo wir gerade bei den SQLBits sind, mittlerweile sind die Sessions der SQLBits 7 online gegangen. Hier gehst zum Video meiner Session &amp;gt;&lt;a href="http://www.sqlbits.com/Sessions/Event7/The_Developer_Side_of_the_Microsoft_Business_Intelligence_stack"&gt;&lt;font color="#000000"&gt;The Developer Side of the Microsoft Business Intelligence stack&lt;/font&gt;&lt;/a&gt;&amp;lt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sqlbits.com/Information/SessionSubmission.aspx"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IveSubmmitted[1]" border="0" alt="IveSubmmitted[1]" src="http://lh5.ggpht.com/_1gJtalph07w/TSCwH2-5TWI/AAAAAAAAAQU/TEtMvEYTv4o/IveSubmmitted%5B1%5D%5B4%5D.png?imgmax=800" width="151" height="103" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-2889578182197974146?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2889578182197974146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2889578182197974146'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2011/01/frohes-neues-jahr-2011.html' title='Frohes neues Jahr 2011 !'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1gJtalph07w/TSCwH2-5TWI/AAAAAAAAAQU/TEtMvEYTv4o/s72-c/IveSubmmitted%5B1%5D%5B4%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6997040948293091147</id><published>2010-11-13T12:41:00.001+01:00</published><updated>2010-11-13T12:41:06.611+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>PASS Summit, TechEd &amp; TechNet… was für eine Woche!</title><content type='html'>&lt;p&gt;Wow, das war doch mal eine Woche! Da gab es endlich wieder etliche Überschneidungen im Kalender.&lt;/p&gt;  &lt;p&gt;Wir hatten den PASS Summit in Seattle, die TechEd Europe in Berlin und noch ein TechNet MS SQL &amp;amp; BI Seminar in Hamburg.&lt;/p&gt;  &lt;p&gt;Die Keynotes des Summits gabs auch gleich noch als Livestream. Sessions der TechEd sind wie gewohnt bereits online verfügbar.&lt;/p&gt;  &lt;p&gt;Sowohl auf dem Summit als auch auf der TechEd wurden diverse Ankündigungen bzgl. des neuen SQL Servers gemacht. Highlights sind wohl u. a.:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Project Crescent (ultra cooles Reporting / Dashboard Tool auf Basis Silverlight)&lt;/li&gt;    &lt;li&gt;Business Intelligence Semantic Model (BISM)&lt;/li&gt;    &lt;li&gt;VertiPaq in der relationalen Welt (eine Renaissance von ROLAP ?)&lt;/li&gt;    &lt;li&gt;und vieles, vieles mehr…&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Und es gab dazu viele Emotionen diese Woche.&lt;/p&gt;  &lt;p&gt;Chris Webb z. B. sprach da wohl vielen von uns aus der Seele. &lt;/p&gt;  &lt;p&gt;&lt;a title="http://cwebbbi.wordpress.com/2010/11/11/pass-summit-day-2/" href="http://cwebbbi.wordpress.com/2010/11/11/pass-summit-day-2/"&gt;http://cwebbbi.wordpress.com/2010/11/11/pass-summit-day-2/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Da wurde wohl das eine oder andere ein wenig zu euphorisch angekündigt und präsentiert. Zumindest entstand bei einigen der nachhaltige Eindruck, dass das klassische UDM keine große Zukunft mehr hat. Das Gerücht, dass MDX tot sei und DAX nun für alles herhalten muss entstand. Microsoft hat (fast schon ungewohnt) schnell auf diese Gerüchte reagiert.&lt;/p&gt;  &lt;p&gt;Selbst Amir Netz hat den Post von Chris mit einem Kommentar bedacht. Müsst Ihr ein wenig nach unten blättern.&lt;/p&gt;  &lt;p&gt;Als Antwort an Alle, die nun ähnliche Bedenken haben, was die Zukunft von UDM, MDX, OLAP &amp;amp; Co ist, hat das SQL Server Team (namentlich T.K. Anand) nun folgenden Post verfasst:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://blogs.technet.com/b/dataplatforminsider/archive/2010/11/12/analysis-services-roadmap-for-sql-server-denali-and-beyond.aspx" href="http://blogs.technet.com/b/dataplatforminsider/archive/2010/11/12/analysis-services-roadmap-for-sql-server-denali-and-beyond.aspx"&gt;http://blogs.technet.com/b/dataplatforminsider/archive/2010/11/12/analysis-services-roadmap-for-sql-server-denali-and-beyond.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Kurzfassung: &lt;strong&gt;BISM soll UDM (OLAP) nicht ersetzen!&lt;/strong&gt; Wir werden noch viele weitere Jahre (Releases) unseren Spaß und Freude mit MDX &amp;amp; Co haben können. Sofern natürlich gewünscht, da wir alle (also mal so als BI Pro an BI Pro) dem BISM und DAX eine Chance geben sollen. Ich für meinen Teil bin auf jeden Fall neugierig auf diese weitere Seite von MS BI und werde sie darauf gehend prüfen, ob sie weitere Bemühungen hinsichtlich einer umfassenden Repository Umgebung überflüssig machen wird. Bin ja bekanntlich ein Fan von Repositories für die Vereinfachung und Steuerung von komplexeren DWH und BI Umgebungen. Schauen wir mal, es bleibt weiterhin Spannend!&amp;#160; &lt;/p&gt;  &lt;p&gt;Wo wir gerade bei DAX sind. Da war ja auch noch das TechNet Seminar in Hamburg. Thema war “Managed Self-Service Business Intelligence mit …” aktuellen Bits und Bytes. Mein Job während dieser Tagesveranstaltung in der Hamburger MS Niederlassung war eine zweistündige recht technische Session über das aktuelle PowerPivot in Excel und SharePoint. Hat mir auf jeden Fall viel Spaß gemacht unsere (PSG) Erfahrungen mit dieser Technologie an Kunden &amp;amp; Partner weiterzugeben. &lt;/p&gt;  &lt;p&gt;Im Anschluss an das TechNet Seminar fand bei Microsoft auch noch das monatliche Treffen der Hamburger SQL Server Community (PASS) statt. Vielen Dank an MS für den Raum, den Sprecher (Frank) und das Catering! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6997040948293091147?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6997040948293091147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6997040948293091147'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/11/pass-summit-teched-technet-was-fur-eine.html' title='PASS Summit, TechEd &amp;amp; TechNet… was für eine Woche!'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-1748479605158868237</id><published>2010-11-04T17:51:00.001+01:00</published><updated>2010-11-04T17:51:17.291+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>MDXScript Object in Analysis Management Objects (AMO)</title><content type='html'>&lt;p&gt;Eine Frage kommt im Zusammenhang mit den Analysis Management Objects immer wieder: &lt;strong&gt;Wie kann auf das MDX Skript zugegriffen werden?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Und auch dafür sind tatsächlich nur wenige Zeilen Code notwendig! AMO sei Dank!&lt;/p&gt;  &lt;p&gt;Mit diesem Codeschnipsel lese ich das MDX Skript aus und zeige ihn in einer Textbox an. Statt der Textbox könnt Ihr natürlich auch eine Variable oder sonst was verwenden.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;using Microsoft.AnalysisServices;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Server srv = new Server();&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;srv.Connect(&amp;quot;localhost&amp;quot;); // Dein Server Name!&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;myTB.Text = srv.Databases.GetByName(&amp;quot;Adventure Works DW 2008&amp;quot;).Cubes.GetByName(&amp;quot;Adventure Works&amp;quot;).MdxScripts[0].Commands[0].Text; // Deine SSAS DB &amp;amp; Dein Cube&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;srv.Disconnect();&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;So, und natürlich kommt auch gleich wieder die Frage wie denn nun das MDX Skript geschrieben werden kann? Mit dem BIDSHelper ist es ja möglich dies innerhalb des Business Intelligence Development Studios (BIDS halt) zu machen.&lt;/p&gt;  &lt;p&gt;Auch hierfür sind nur wenige Zeilen Code notwendig. Also genaugenommen brauche ich dazu nur eine weitere Zeile.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;using Microsoft.AnalysisServices;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Server srv = new Server();&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;srv.Connect(&amp;quot;localhost&amp;quot;); &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;srv.Databases.GetByName(&amp;quot;Adventure Works DW 2008&amp;quot;).Cubes.GetByName(&amp;quot;Adventure Works&amp;quot;).MdxScripts[0].Commands[0].Text = myTB.Text;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;srv.Databases.GetByName(&amp;quot;Adventure Works DW 2008&amp;quot;).Cubes.GetByName(&amp;quot;Adventure Works&amp;quot;).MdxScripts[0].Update();&amp;#160; // Wichtig! Hiermit wird das “kurz” mal aktualisiert.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;srv.Disconnect();&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Die Bereitstellung des MDX Skriptes geht äußerst schnell. Probiert es einfach mal aus! &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-1748479605158868237?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1748479605158868237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1748479605158868237'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/11/mdxscript-object-in-analysis-management.html' title='MDXScript Object in Analysis Management Objects (AMO)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4531194945981218545</id><published>2010-10-30T17:00:00.001+02:00</published><updated>2010-10-30T17:00:51.189+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Cast'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>LastProcessed Status einer Cube Partition mittels SSIS auslesen</title><content type='html'>&lt;p&gt;Als ein Feedback auf &lt;a href="http://saschalorenz.blogspot.com/2010/10/analysis-services-metadaten-mittels-amo.html" target="_blank"&gt;meine letzten Casts&lt;/a&gt; bekam ich die Nachfrage, ob und wie denn der LastProcessed Status einer SSAS Cube Partition mittels der SSIS Skriptkomponente und Analysis Management Objects ausgelesen werden kann. Als Antwort darauf habe ich wieder einen kleinen Cast aufgenommen. Ich hoffe alle wesentlichen Schritte sind klar und verständlich geworden.&lt;/p&gt;  &lt;p&gt;Viel Erfolg damit!&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:a7e54401-3a19-466d-a53c-d80a707a0708" class="wlWriterEditableSmartContent"&gt;&lt;div id="00e918f3-17ac-4f01-8616-a55aabcb883e" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=QU2l8BkdvOM&amp;amp;feature=youtube_gdata_player" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_1gJtalph07w/TMwzICJQXyI/AAAAAAAAAQM/1i4x1WGlzP0/video5912918a90d1%5B2%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('00e918f3-17ac-4f01-8616-a55aabcb883e'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/QU2l8BkdvOM&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/QU2l8BkdvOM&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4531194945981218545?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4531194945981218545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4531194945981218545'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/10/lastprocessed-status-einer-cube.html' title='LastProcessed Status einer Cube Partition mittels SSIS auslesen'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1gJtalph07w/TMwzICJQXyI/AAAAAAAAAQM/1i4x1WGlzP0/s72-c/video5912918a90d1%5B2%5D.jpg?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-1111004778324650527</id><published>2010-10-27T18:00:00.001+02:00</published><updated>2010-10-27T18:00:23.087+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Cast'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><title type='text'>SSIS Skriptkomponente als Datenquelle verwenden für z. B. AMO, MDX Queries etc.</title><content type='html'>&lt;p&gt;Aufgrund des Feedbacks zum Post über meine AMO Aktivitäten für den Aufbau eines Microsoft Business Intelligence Repositorys, habe ich wieder einen kleinen Webcast aufgenommen. In diesem zeige ich die Verwendung des SSIS Skripttasks als Datenquelle für Analysis Management Objects oder auch MDX Abfragen. Des Weiteren zeige ich auch wie Ihr Euch mit SSIS Test- bzw. Demodaten erzeugen könnt.&lt;/p&gt;  &lt;p&gt;Viel Erfolg beim selbst ausprobieren!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:887c6d19-cd8f-4758-a50b-43f63436b0a9" class="wlWriterEditableSmartContent"&gt;&lt;div id="88aecc0b-f4b2-4690-8720-d8fca69a3f74" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=LdmyeyBoAnU" target="_new"&gt;&lt;img src="http://lh3.ggpht.com/_1gJtalph07w/TMhMlBgOxEI/AAAAAAAAAQI/DBPuHOWpcQ4/videobd55e3740932%5B4%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('88aecc0b-f4b2-4690-8720-d8fca69a3f74'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/LdmyeyBoAnU&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/LdmyeyBoAnU&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-1111004778324650527?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1111004778324650527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1111004778324650527'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/10/ssis-skriptkomponente-als-datenquelle.html' title='SSIS Skriptkomponente als Datenquelle verwenden für z. B. AMO, MDX Queries etc.'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/TMhMlBgOxEI/AAAAAAAAAQI/DBPuHOWpcQ4/s72-c/videobd55e3740932%5B4%5D.jpg?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-8121222332294444975</id><published>2010-10-24T14:56:00.001+02:00</published><updated>2010-10-24T14:56:16.924+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Analysis Services Metadaten mittels AMO in einem SSIS Task auslesen</title><content type='html'>&lt;p&gt;Kurze Rückmeldung von mir. Bin vom PASS Camp 2010 R2 zurück. Meine Session lief wohl soweit erfolgreich. Das Camp als Ganzes war aus meiner Sicht ein voller Erfolg! Details dazu werden noch folgen!&lt;/p&gt;  &lt;p&gt;Bin an der weiteren Integration eines &lt;a href="http://saschalorenz.blogspot.com/2010/07/uberlegungen-uber-den-aufbau-eines.html" target="_blank"&gt;umfassenden Repositorys für die Microsoft BI Umgebung&lt;/a&gt;. Ein Aspekt dabei ist der Zugriff auf die Metadaten eines SSAS Cubes mittels &lt;a href="http://saschalorenz.blogspot.com/2010/10/analysis-management-objects-aka-amo.html" target="_blank"&gt;Analysis Management Objects&lt;/a&gt;. Bin zurzeit am entwickeln einer Komponente für die Integration Services für den direkten Zugriff auf einen Würfel und seine Informationen. Erste Tests mit der Skriptkomponente laufen bereits sehr gut. :-)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TMQs4tEmDGI/AAAAAAAAAQA/brn0ib79pl4/s1600-h/image%5B15%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TMQs7z2SdOI/AAAAAAAAAQE/4IZJdxt-8pA/image_thumb%5B9%5D.png?imgmax=800" width="905" height="395" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-8121222332294444975?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8121222332294444975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8121222332294444975'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/10/analysis-services-metadaten-mittels-amo.html' title='Analysis Services Metadaten mittels AMO in einem SSIS Task auslesen'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1gJtalph07w/TMQs7z2SdOI/AAAAAAAAAQE/4IZJdxt-8pA/s72-c/image_thumb%5B9%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4180633217606214377</id><published>2010-10-14T09:02:00.001+02:00</published><updated>2010-10-14T09:02:47.132+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Phone 7'/><title type='text'>Microsoft hat auch eine Software für 3D Modelle!</title><content type='html'>&lt;p&gt;Hätte ich ja fast vergessen! Mal was ganz anderes…&lt;/p&gt;  &lt;p&gt;Ich war vorgestern Abend auf dem MS TechTalk zum Windows Phone 7. Da kam unteranderem das Thema Entwicklung von Spielen für das WP7 auf und die Frage woher der Entwickler denn 3D Modelle bekommen könnte bzw. womit er diese erstellen sollte. Es wurden alle Top Tools am Markt genannt. Da fiel mir ein, dass ja Microsoft vor ein paar Jahren ein ähnliches Tool gekauft hatte (bzw. die Company drum rum), ich kam zwar nicht auf den Namen, aber eine Stimme hinter mir erinnerte sich dann: &lt;strong&gt;TrueSpace&lt;/strong&gt;! Dank an den Unbekannten! Yepp, TrueSpace (Caligari) gehört zu MS und TrueSpace gibst schon seit einiger Zeit for-free!&lt;/p&gt;  &lt;p&gt;TrueSpace kann meinem Kenntnisstand nach auch Modelle für DirectX (und XNA) erstellen. Habe gerade keine Zeit dieses zu testen, aber hier der &lt;a href="http://www.caligari.com/downloads.html" target="_blank"&gt;Link zum Download&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TLarEe5RkRI/AAAAAAAAAP4/p7rdohgVdr8/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/TLarFH9UepI/AAAAAAAAAP8/1cXyVAQSt_M/image_thumb%5B3%5D.png?imgmax=800" width="562" height="446" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4180633217606214377?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4180633217606214377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4180633217606214377'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/10/microsoft-hat-auch-eine-software-fur-3d.html' title='Microsoft hat auch eine Software für 3D Modelle!'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/TLarFH9UepI/AAAAAAAAAP8/1cXyVAQSt_M/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4529761976911490168</id><published>2010-10-13T14:37:00.001+02:00</published><updated>2010-10-13T14:37:04.267+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cast'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Excel Cube Funktionen (dynamische CUBEMENGE)</title><content type='html'>&lt;p&gt;Auf meinen Cast für das Beispiel für die &lt;a href="http://saschalorenz.blogspot.com/2010/10/weiterer-webcast-uber-die-cube.html" target="_blank"&gt;Excel Cube Funktion CUBEMENGE&lt;/a&gt; bekam ich nun das Feedback, dass das zum Teil zu schnell ging. Zwar kann ja die Pause Taste gedrückt werden, aber nicht jeder kam mit, wie ich die Zellen denn nun im Excel miteinander verknüpfe. Daher hier nun eine Übersicht darüber:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TLWn5z18xMI/AAAAAAAAAPw/j8EsqhxS4C4/s1600-h/CUBEMENGE%20Beispiel%5B12%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="CUBEMENGE Beispiel" border="0" alt="CUBEMENGE Beispiel" src="http://lh6.ggpht.com/_1gJtalph07w/TLWn7sGyUbI/AAAAAAAAAP0/s2mvQcexSeg/CUBEMENGE%20Beispiel_thumb%5B8%5D.png?imgmax=800" width="740" height="557" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Also, im oberen Ausschnitt aus Excel habe ich eine Liste (keine Excel Liste!) erstellt, welche eine Nummerierung, einen endbenutzerfreundlichen Namen und die jeweilige Beschreibung einer Menge (Set) in MDX enthält. Das läuft zusammen in einer Excel Formel mit der Funktion VERWEIS. Diese holt sich als “Parameter” eine Zahl (oben die “1”). Die Zelle wird aber gefüllt über das Listboxelement, welches ich im eigentlichen Report/Dashboard im unteren Ausschnitt verwende. Diese Listbox holt sich ihre Elemente für die Darstellung wiederum aus der selben Liste. &lt;/p&gt;  &lt;p&gt;Die eigentliche Magie steckt aber in der Formel in C3 (untere rote Ellipse) mit der CUBEMENGE Funktion. Wir geben dort als Bezeichner einfach “menge” aus, aber mittels der CUBERANGELEMENT Funktion greifen wir dann in der Spalte D auf die (unsichtbaren) Elemente innerhalb der Menge in C3 zu! Die Elemente in der Spalte D wiederum dienen den CUBEWERT Funktionen in den Spalten E &amp;amp; F als Parameter.&lt;/p&gt;  &lt;p&gt;Durch die Auswahl eines Eintrags in der Listbox wird die Ordnungszahl des Eintrags in eine Zelle geschrieben (obere rote Ellipse) und dient der VERWEIS Funktion als Parameter. Das Ergebnis (ein MDX Ausdruck) ist dann der Parameter für die CUBEMENGE Funktion (untere Ellipse). &lt;/p&gt;  &lt;p&gt;Hoffe, das hier hat das Konzept noch ein wenig verdeutlicht. Bei Fragen, mich sonst bitte einfach ansprechen!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4529761976911490168?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4529761976911490168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4529761976911490168'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/10/excel-cube-funktionen-dynamische.html' title='Excel Cube Funktionen (dynamische CUBEMENGE)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1gJtalph07w/TLWn7sGyUbI/AAAAAAAAAP0/s2mvQcexSeg/s72-c/CUBEMENGE%20Beispiel_thumb%5B8%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-1971462983592265736</id><published>2010-10-12T16:40:00.001+02:00</published><updated>2010-10-12T16:40:29.392+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Cast'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Weiterer Webcast über die Cube Funktionen in Excel (dynamische CUBEMENGE)</title><content type='html'>&lt;p&gt;Damit habe ich nicht gerechnet! &lt;a href="http://saschalorenz.blogspot.com/2010/10/webcast-fur-cube-funktionen-in-excel.html" target="_blank"&gt;Vielen Dank für das Feedback und die vielen Fragen zu meinem kleinen Cast über die Cube Funktionen in Excel&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Eine Frage kam dabei gleich häufiger: &lt;strong&gt;Ist die Funktion CUBEMENGE nun nur statisch? Wo ist dann der wirkliche Vorteil für mich als Controller?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ok, das kann beantwortet werden. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Nein, es ist sehr wohl möglich CUBEMENGE dynamisch zu nutzen&lt;/strong&gt;. Es kann sogar die Dimension, Hierarchie und der Level dynamisch ausgetauscht werden. Wie? Das zeige ich in diesem zweiten kleinen Cast! Hoffe, dass dieser wieder ein wenig Licht ins Dunkel bringen kann und noch mehr von den Möglichkeiten der Cube Funktionen in Excel zeigt. Bin mir sehr sicher, dass ich dazu in Zukunft noch ein wenig was zeigen werde.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 436px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:f1dfae7b-48af-4bc2-9d1c-8a10543494d9" class="wlWriterEditableSmartContent"&gt;&lt;div id="e744377c-fb75-4a19-8095-9225fb0e4ae3" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=MY2C-zvDi24&amp;amp;feature=youtube_gdata_player" target="_new"&gt;&lt;img src="http://lh5.ggpht.com/_1gJtalph07w/TLRzXBgMBvI/AAAAAAAAAPs/HA-hfisK3A0/video83dbd88153a8%5B2%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('e744377c-fb75-4a19-8095-9225fb0e4ae3'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;436\&amp;quot; height=\&amp;quot;327\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/MY2C-zvDi24&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/MY2C-zvDi24&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;436\&amp;quot; height=\&amp;quot;327\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-1971462983592265736?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1971462983592265736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1971462983592265736'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/10/weiterer-webcast-uber-die-cube.html' title='Weiterer Webcast über die Cube Funktionen in Excel (dynamische CUBEMENGE)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1gJtalph07w/TLRzXBgMBvI/AAAAAAAAAPs/HA-hfisK3A0/s72-c/video83dbd88153a8%5B2%5D.jpg?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-5773779524754052030</id><published>2010-10-10T14:44:00.001+02:00</published><updated>2010-10-10T14:44:31.339+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><title type='text'>Analysis Management Objects (aka AMO) Overview</title><content type='html'>&lt;p&gt;Hier ein Slide aus meinem Deck über Analysis Management Objects. Bin gerade am “Aufräumen”, da ich nächste Woche im &lt;a href="http://saschalorenz.blogspot.com/2010/10/einladung-zum-54-pass-treffen-in.html" target="_blank"&gt;PASS Chapter Hamburg&lt;/a&gt; einen kleinen Vortrag darüber halten werde und in der Woche drauf dann während des &lt;a href="http://www.passcamp.de" target="_blank"&gt;PASS Camps&lt;/a&gt; das Thema im Detail mit den Teilnehmern durchgehen werde.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TLG1JJHsnbI/AAAAAAAAAPk/mOCMlu72H7E/s1600-h/AMO%20Objects%20Overview%5B9%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="AMO Objects Overview" border="0" alt="AMO Objects Overview" src="http://lh3.ggpht.com/_1gJtalph07w/TLG1LbBc0TI/AAAAAAAAAPo/0eR-6yd2HAs/AMO%20Objects%20Overview_thumb%5B5%5D.png?imgmax=800" width="561" height="422" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Ich poste das Slide, da ich in meiner Rolle als Coach &amp;amp; Berater immer wieder auf die Meinung treffe, dass die SQL Server Analysis Services sich primär um den OLAP Cube als Objekt drehen. Das ist aber nur bedingt richtig. Zwar ist “der Cube” meist das Ziel in der Arbeit mit den Analysis Services, aber im Vordergrund steht die Arbeit mit der SSAS Datenbank. Ein OLAP Cube ist nur ein Teil dieser Datenbank! Aus diesem Missverständnis heraus entstehen meist irrtümliche Annahmen über den Aufbau von Cubes und der darunterliegenden Strukturen. Als Coach empfehle ich jedem, der mit SSAS zu tun hat, dass er sich bei Zeiten mal näher mit den Analysis Management Objects auseinandersetzt, da “das Codieren” eines Cubes (und damit einer SSAS Datenbank) durchaus neue Erkenntnisse und Einsichten über den Aufbau der Analysis Services bringen kann.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-5773779524754052030?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5773779524754052030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5773779524754052030'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/10/analysis-management-objects-aka-amo.html' title='Analysis Management Objects (aka AMO) Overview'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/TLG1LbBc0TI/AAAAAAAAAPo/0eR-6yd2HAs/s72-c/AMO%20Objects%20Overview_thumb%5B5%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4965972278629162078</id><published>2010-10-10T11:31:00.001+02:00</published><updated>2010-10-10T11:31:37.702+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><title type='text'>Einladung zum 54. PASS Treffen in Hamburg</title><content type='html'>&lt;p&gt;Diese Woche ist es wieder soweit! Das monatliche PASS Treffen in Hamburg steht an.&lt;/p&gt;  &lt;p&gt;Wir werden uns im Detail die Analysis Management Objects (aka AMO) zum Zugriff auf die SQL Server Analysis Services anschauen und anhand von Codebeispielen lernen, wie diese für den Aufbau von OLAP Cubes auf Basis eines &lt;a href="http://saschalorenz.blogspot.com/2010/07/uberlegungen-uber-den-aufbau-eines.html" target="_blank"&gt;Repositories&lt;/a&gt; genutzt werden können. AMO ist bitte nicht zu verwechseln mit &lt;a href="http://saschalorenz.blogspot.com/2010/07/adomdnet-und-die-cellset-klasse.html" target="_blank"&gt;ADOMD.NET&lt;/a&gt;, welches eher für den Zugriff auf die Daten eines OLAP Cubes genutzt wird. &lt;/p&gt;  &lt;p&gt;Details zum Treffen findet Ihr unter &lt;a title="http://bit.ly/ciRv5e" href="http://bit.ly/ciRv5e"&gt;http://bit.ly/ciRv5e&lt;/a&gt;!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4965972278629162078?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4965972278629162078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4965972278629162078'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/10/einladung-zum-54-pass-treffen-in.html' title='Einladung zum 54. PASS Treffen in Hamburg'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-3256995413903195425</id><published>2010-10-07T17:45:00.001+02:00</published><updated>2010-10-07T17:47:31.682+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Cast'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><title type='text'>Webcast über Cube Funktionen in Excel</title><content type='html'>&lt;p&gt;Im Mai diesen Jahres hatte ich einen Blogbeitrag geschrieben über die &lt;a href="http://saschalorenz.blogspot.com/2010/05/cube-funktionen-in-excel-2007-2010.html" target="_blank"&gt;Cube Funktionen in Excel 2007 &amp;amp; 2010&lt;/a&gt;. Die letzten Monate habe ich eine ganze Menge Feedback dazu bekommen. Die Funktionen scheinen bisher nicht so bekannt gewesen zu sein und viele haben sich an meiner Schritt-für-Schritt Anleitung versucht. Von einigen Teilnehmern der Community kam der Wunsch nach einen Video zu dem Thema. Diesem bin ich nun endlich nachgekommen. Hoffe, dass der Einstieg in die Arbeit mit den Cube Funktionen nun noch ein wenig einfacher wird. Viel Erfolg!&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px auto; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:1166fe38-f739-4629-ac4a-1545c42a355f" class="wlWriterEditableSmartContent"&gt;&lt;div id="1952d7c1-bd02-46f5-838a-cb3f028236f8" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=C3rRjL96Jmo&amp;amp;feature=youtube_gdata_player" target="_new"&gt;&lt;img src="http://lh6.ggpht.com/_1gJtalph07w/TK3rKvqi-xI/AAAAAAAAAPc/I1TGSyd-j3E/video0c4857c8a0a4%5B6%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('1952d7c1-bd02-46f5-838a-cb3f028236f8'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/C3rRjL96Jmo&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/C3rRjL96Jmo&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-3256995413903195425?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3256995413903195425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3256995413903195425'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/10/webcast-fur-cube-funktionen-in-excel.html' title='Webcast über Cube Funktionen in Excel'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1gJtalph07w/TK3rKvqi-xI/AAAAAAAAAPc/I1TGSyd-j3E/s72-c/video0c4857c8a0a4%5B6%5D.jpg?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-1827695274472035439</id><published>2010-10-05T18:11:00.001+02:00</published><updated>2010-10-05T18:11:12.230+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Erfahrungsbericht SQLBits 7 Konferenz in York, UK</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TKtOHCCv5UI/AAAAAAAAAPM/NsBxvyy9aKY/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="left" src="http://lh6.ggpht.com/_1gJtalph07w/TKtOH7Pbw3I/AAAAAAAAAPQ/HbS2S7_h5PE/image_thumb%5B3%5D.png?imgmax=800" width="278" height="331" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So, und &lt;a href="http://saschalorenz.blogspot.com/2010/09/back-from-vacation.html" target="_blank"&gt;schon wieder von was zurück&lt;/a&gt;… :-)&lt;/p&gt;  &lt;p&gt;Dieses Mal von der größten SQL Server Konferenz in Europa. Der &lt;a href="http://www.sqlbits.com/" target="_blank"&gt;SQLBits&lt;/a&gt; Konferenz. Diese fand nun schon zum siebten mal statt. Als Veranstaltungsort wurde die University of York gewählt. Genauer gesagt das Exhibition Center des Heslington Campus in York. Ein modernes Universitätsgelände mit dem entsprechenden geselligen und gelehrigen Charme. &lt;/p&gt;  &lt;p&gt;Für mich war es die erste SQLBits. Und nicht genug, ich war auch gleich Sprecher.&lt;/p&gt;  &lt;p&gt;Die Konferenz bestand aus drei Tagen: &lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;- einem Workshop Tag, also klassische kostenpflichte Pre-Con (Donnerstag)&lt;/li&gt;      &lt;li&gt;- einem Tag, für den bezahlt werden musste, &lt;a href="http://www.sqlbits.com/information/Friday.aspx" target="_blank"&gt;da “hochwertiger” Content&lt;/a&gt; (Freitag)&lt;/li&gt;      &lt;li&gt;- und einem Community Tag, welcher von Sponsoren finanziert wurde (Samstag)&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Die Organisatoren hatten meine Session für den Freitag ausgewählt. Die Session hatte den Titel “&lt;a href="http://www.sqlbits.com/Agenda/event7/The_Developer_Side_of_the_Microsoft_Business_Intelligence_stack/default.aspx" target="_blank"&gt;The Developer Side of the Microsoft Business Intelligence stack&lt;/a&gt;”, welche eine 60 min. Zusammenstellung der vielseitigen Möglichkeiten der Nutzung des Microsoft SQL Servers in Enterprise Business Intelligence und Data Warehouse Umgebungen bot. Durch meine Erfahrung (als Teil von &lt;a href="http://www.psg.de" target="_blank"&gt;PSG&lt;/a&gt;) in Projekten, konnte ich das fast ausschließlich englische Publikum, von denen wiederum wohl fast jeder in irgendeiner Bank in the City of London arbeitete, hoffentlich über die eine oder andere Audit und Compliance Hürde helfen. Als Raum war mir das Lecture Theatre zugewiesen worden, eine Mischung aus Hörsaal und Multiplex-Kino. &lt;/p&gt;  &lt;p&gt;Meine Session verlief gut. War ja auch genau mein Thema, hätte noch locker 2-3 Stunden weitergehen können. Hatte im Anschluss noch einige sehr gute Gespräche zu dem Thema. Der Vortrag wird in den nächsten Tagen auf den SQLBits Seiten veröffentlicht werden.&lt;/p&gt;  &lt;p&gt;So, nun aber zu der Frage: Wie war denn nun so die SQLBits insgesamt? Lohnt es sich dafür extra nach England zu kommen? Ach ja, wie viele Teilnehmer aus Deutschland denn waren da?&lt;/p&gt;  &lt;p&gt;Also, mir hat die Konferenz sehr gut gefallen! Und es lohnt sich definitiv dafür nach England zu kommen! Daher meine SQL Konferenz Empfehlungen fürs nächste Jahr: Besucht die &lt;a href="http://www.european-pass-conference.com/" target="_blank"&gt;European PASS&lt;/a&gt; und nimmt eine SQLBits mit! Eine? Ja, davon gibst immer zwei im Jahr! Der Flug nach England ist günstig und Ihr könnt alles gut mit der Bahn erreichen. Ach ja, also ich glaube, es waren mit mir vier Deutsche (liebe Grüße an Sabrina und Tillmann, welche mir vom Vierten erzählten) dort und Klaus Aschenbrenner aus Österreich.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Vielen Dank an die Organisatoren und Teilnehmer der SQLBits für dieses großartige Event!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Many thanks to the organizers and participants of the SQLBits for this great event!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Wenn Euch das Thema meiner Session interessiert und Ihr mehr darüber erfahren wollt oder gar mit mir diskutieren wollt über Euren eigenen Anforderungen und wie wir diese gemeinsam lösen könnten mit dem MS SQL Server Business Intelligence Stack… dann… kommt zum &lt;a href="http://www.passcamp.de/" target="_blank"&gt;PASS Camp&lt;/a&gt; in der übernächsten Woche in Mettmann bei Neuss! Wir werden dort alles was ich in York gezeigt habe anfassen, ausprobieren, weiterentwickeln, zerlegen und neumachen… ach ja, und wir werden viel diskutieren, Ideen entwickeln und ich werde versuchen, Euch meine Konzepte und Denkweise bei der Entwicklung solcher Lösungen nahezubringen. &lt;/p&gt;  &lt;p&gt;Twitter-&amp;gt; #passcamp :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-1827695274472035439?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1827695274472035439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1827695274472035439'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/10/erfahrungsbericht-sqlbits-7-konferenz.html' title='Erfahrungsbericht SQLBits 7 Konferenz in York, UK'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1gJtalph07w/TKtOH7Pbw3I/AAAAAAAAAPQ/HbS2S7_h5PE/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-7094614131590887955</id><published>2010-09-27T15:46:00.002+02:00</published><updated>2010-09-28T08:30:11.664+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='PSG'/><title type='text'>Back from Vacation</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TKCgRmZ5WqI/AAAAAAAAAPE/ez7tI3r07r0/s1600-h/GEDC0392%5B1%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="GEDC0392" border="0" alt="GEDC0392" align="left" src="http://lh3.ggpht.com/_1gJtalph07w/TKCgTn3AncI/AAAAAAAAAPI/ZYW373Hyqqo/GEDC0392_thumb.jpg?imgmax=800" width="355" height="423" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Bin nun seit ein paar “Tagen” aus meinem letzten Urlaub zurück. Und schon wieder unermüdlich mit meinen Kollegen aus den unterschiedlichen Teams unterwegs gewesen. Es lagen sowohl spannende Workshops als auch herausfordernde Projekte rund um den SQL Server an. Vielen Dank an meine Kollegen für die zahlreiche Unterstützung vor Ort!&lt;/p&gt;&lt;p&gt;Eine Überraschung habe ich direkt vor meiner Haustür vorgefunden! Und zwar scheint nun auch in meinem Dorf das Highspeed-Internet Zeitalter zu beginnen. Anbei seht Ihr ein Foto von meinem ganz privaten Glasfaserkabel direkt ins Haus. Angeblich sollen darüber “demnächst” bis zu 50 MBit möglich sein. Ich bin gespannt und werde berichten. Habe auch schon die eine oder andere Idee, wie die SQL Community davon profitieren könnte.&lt;/p&gt;&lt;p&gt;Kommen wir zu einem sehr wichtigen Punkt: Der &lt;strong&gt;&lt;a href="http://mv.sqlpass.de/" target="_blank"&gt;Mitgliederversammlung des PASS Deutschland e.V. am 18. Oktober 2010&lt;/a&gt; !&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Im Rahmen des &lt;a href="http://www.passcamp.de/" target="_blank"&gt;PASS Camp&lt;/a&gt; findet dieses Jahr wieder eine MV statt. Ein wichtiger Punkt dabei ist die Wahl des Vorstandes. Ich bitte Euch zahlreich zu erscheinen, denn IHR SEID DIE COMMUNITY! Es gibt als Vortrag “drum rum” das spannende Thema „Parallel Data Warehouse“ von Ralph Kemperdick (Microsoft Deutschland).&lt;/p&gt;&lt;p&gt;Und wo wir gerade beim &lt;a href="http://www.passcamp.de/" target="_blank"&gt;PASS Camp&lt;/a&gt; sind! Dieses findet vom &lt;strong&gt;19. bis 21. Oktober 2010&lt;/strong&gt; bei Mettmann (Gut Höhne) statt. Wir haben dort 4 spannende 3-Tages Workshops dabei. Es gibt &lt;strong&gt;BI-Front End&lt;/strong&gt;, &lt;strong&gt;SQL Azure&lt;/strong&gt; und das &lt;strong&gt;SQLCAT Team mit BI for Administrators.&lt;/strong&gt; Natürlich möchte ich nicht meinen Workshop “&lt;strong&gt;&lt;a href="http://www.passcamp.de/session1.html" target="_blank"&gt;BI für Entwickler&lt;/a&gt;&lt;/strong&gt;” unerwähnt lassen, welcher dem BI Berater den Nutzen von Programmierung in Business Intelligence Projekten nahebringen wird! Wir werden gemeinsam über den Einsatz von Meta Daten diskutieren und in Form von Hand-on Labs unsere eigenen Tools für die Nutzung eines BI Repositories in SQL Server Umgebungen schreiben. Wir werden dynSSIS erforschen und mittels AMO Cubes aus Meta Daten generieren. Reports (RDL) untersuchen und inventarisieren. Und vieles mehr! Ich freue mich schon auf den Austausch mit Euch!&lt;/p&gt;&lt;p&gt;Aber vorher gehst für mich nach York, UK zur “&lt;a href="http://www.sqlbits.com/" target="_blank"&gt;SQLBits&lt;/a&gt; - The 7 Wonders of SQL” Konferenz. Dort halte ich diesen Freitag die Session “&lt;a href="http://bit.ly/8ZRkFF" target="_blank"&gt;The Developer Side of the Microsoft Business Intelligence stack&lt;/a&gt;”. Ihr seht, bin zurzeit voll im Thema Backend unterwegs! :-)&lt;/p&gt;&lt;p&gt;Und ich möchte noch Werbung machen für folgendes Microsoft TechNet Seminar in Hamburg am 10.11.2010: &lt;a href="http://www.microsoft.com/germany/technet/events/eventdetail.aspx?EventID=1032459835" target="_blank"&gt;Managed Self-Service Business Intelligence mit SQL Server 2008 R2, Sharepoint 2010 und Office 2010&lt;/a&gt;! Im Anschluss an das Treffen findet in der Microsoft Niederlassung auch noch unser monatliches PASS Treffen statt! Wenn Ihr Zeit und Lust habt, dann könnt Ihr also einen ganzen Tag mit SQL Server Themen und der Community verbringen. Hoffe möglichst viele von Euch dort zu treffen! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-7094614131590887955?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7094614131590887955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7094614131590887955'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/09/back-from-vacation.html' title='Back from Vacation'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/TKCgTn3AncI/AAAAAAAAAPI/ZYW373Hyqqo/s72-c/GEDC0392_thumb.jpg?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6931346904261251790</id><published>2010-08-12T10:39:00.001+02:00</published><updated>2010-08-12T10:39:49.042+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Business Intelligence Framework Vortrag auf der SQLBits 7 in York, UK</title><content type='html'>&lt;p&gt;Diese Woche habe ich erfahren, dass ich auf der Konferenz SQLBits 7 (The 7 Wonders of SQL) eine Session halten darf! &lt;/p&gt;  &lt;p&gt;Die SQLBits ist wohl mit die größte SQL Server Konferenz, welche man auf dieser Seite des Atlantiks finden kann und findet in UK statt. Dieses mal geht es nach York an die &lt;a href="http://www.sqlbits.com/information/Travel.aspx"&gt;York University&lt;/a&gt;. Die Konferenz findet vom 30.9. – 2.10. statt. Weitere Details hier –&amp;gt; &lt;a href="http://www.sqlbits.com"&gt;www.sqlbits.com&lt;/a&gt; . Vielleicht treffe ich ja den einen oder anderen von Euch dort!!?&lt;/p&gt;  &lt;p&gt;Meine Session dreht sich um Business Intelligence und den sinnvollen Einsatz von Developer Tools für die Bereitstellung einer BI Middleware bzw. eines BI Frameworks, welches die Dienste des SQL Server ein wenig fester verbindet.&lt;/p&gt;  &lt;h4&gt;The Developer Side of the Microsoft Business Intelligence stack&lt;/h4&gt;  &lt;p&gt;   &lt;p&gt;&lt;a href="http://www.sqlbits.com/Speakers/Sascha_Lorenz/Default.aspx"&gt;&lt;/a&gt;&lt;/p&gt; The Microsoft SQL Server provides a complete library of programmatically accessed objects for all Business Intelligence relevant services. With this set of functions almost any customer challenge can be solved without the need to purchase additional products. This possibility is often underestimated in projects.     &lt;br /&gt;We will explore the ways how to create powerful solutions with Integration Services, Reporting Services and, of course, Analysis Services. This session provides many samples and .net sourcecode to demonstrate the possibilities of creating your own tools with Windows Forms and Silverlight for your daily work. Many manual clicks and tasks can be automated, really!     &lt;br /&gt;Finally we build a complete Business Intelligence Middleware as a blueprint for your own projects.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sqlbits.com/" target="_blank"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="SQLBits Logo" src="http://www.sqlbits.com/images/sqlbits/SQLBitsLogo.png" width="267" height="91" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Die Themen, welche ich dort in 60 Min anreißen werde, gibt aber auch noch mal im Detail und zwar ganze drei Tage lang mit Hands-on von mir auf dem &lt;a href="http://www.passcamp.de/session1.html" target="_blank"&gt;PASS Camp 2010 R2&lt;/a&gt; in Mettmann bei Düsseldorf!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6931346904261251790?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6931346904261251790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6931346904261251790'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/08/business-intelligence-framework-vortrag.html' title='Business Intelligence Framework Vortrag auf der SQLBits 7 in York, UK'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4205370444845910168</id><published>2010-08-06T10:09:00.001+02:00</published><updated>2010-08-06T10:09:50.569+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Die Website für die Anmeldung zum PASS Camp 2010 (R2) ist online!</title><content type='html'>&lt;p&gt;Hier nur “kurz” die Meldung, dass die Website für die Anmeldung zum PASS Camp 2010 (R2) online gegangen ist!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://saschalorenz.blogspot.com/2010/06/pass-camp-2010-r2-save-date.html" target="_blank"&gt;Ihr erinnert Euch vielleicht&lt;/a&gt;, da bin ich dieses Mal als Sprecher dabei und werde Euch mein absolutes Lieblingsthema drei Tage am Stück nahebringen: Microsoft Business Intelligence für Entwickler!&lt;/p&gt;  &lt;p&gt;Hier gehst zum &lt;a href="http://www.sqlpasscamp.de/default.html" target="_blank"&gt;PASS Camp 2010&lt;/a&gt;! &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Das ist die Agenda für meinen Track:&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Dienstag&lt;/strong&gt;, 19.10.2010&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Einleitung - Warum überhaupt programmieren?      &lt;br /&gt;Der Microsoft SQL Server bietet eine ganze Reihe von äußerst mächtigen Diensten und Werkzeugen für die Erstellung von Business Intelligence Lösungen. Warum sollte sich dann überhaupt ein BI Berater mit den Möglichkeiten der Programmierbarkeit des SQL Servers beschäftigen? Weicht er damit nicht vom Standard ab? Und warum sollte sich ein Programmierer mit BI befassen? Sind die BI relevanten Dienste vom SQL Server etwa nicht fertig?       &lt;br /&gt;Die Wahrheit ist, dass eine wesentliche Stärke des SQL Servers, neben den bekannten Werkzeugen, die Verfügbarkeit von diversen sehr gut dokumentierten APIs ist. Diese APIs können sehr gut im Rahmen von BI Projekten genutzt werden und die Integrationsfähigkeit einer BI Lösung um ein vielfaches erhöhen. Alle in diesem Workshop vorgestellten Schnittstellen sind offiziell von Microsoft beschrieben worden und werden in zukünftigen Versionen unterstützt werden.       &lt;br /&gt;Vor dem Einsatz von Technologie kommt aber immer die zielgerichtete Konzeption der Lösung. Es wird gezeigt, wann und wie sich der Einsatz von Programmierung in BI Projekten tatsächlich rechnet und welche Voraussetzungen dafür erfüllt sein müssen.      &lt;br /&gt;Ein ganz wesentlicher Punkt aus der Erfahrung heraus ist die Nutzung der Abstraktion der Anforderungen und der Technologie als Architekturansatz im Design von Business Intelligence Lösungen. &lt;/li&gt;    &lt;li&gt;Einführung mittels Crashkurs in die Entwicklung mit dem Visual Studio 2010      &lt;br /&gt;Damit alle mit den gleichen Voraussetzungen starten können, gibt es nach dem ersten Brocken Theorie, einen Crashkurs für die Nutzung des Visual Studios 2010.      &lt;br /&gt;Anhand von Labs wird die grundlegende Handhabung des Visual Studios vermittelt und in die Programmierung mit dem .net Framework eingeführt.       &lt;br /&gt;Dabei werden folgende Themen erläutert:      &lt;br /&gt;- Command Line Tools       &lt;br /&gt;- PowerShell (CmdLets)       &lt;br /&gt;- Entwicklung von einfachen GUIs       &lt;br /&gt;- XML-Files als Parameter verwenden       &lt;br /&gt;- Nutzung von ADO.NET für den Zugriff auf den SQL&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Mittwoch&lt;/strong&gt;, 20.10.2010&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;SQL Server Analysis Services     &lt;br /&gt;Nun kommen die Analysis Services an die Reihe. Zunächst beschäftigen wir uns kurz mit ein wenig MDX Grundlagen, um dann mittels ADOMD.NET OLAP Cubes direkt abzufragen. Damit haben wir die Grundlage für eigene OLAP Clients geschaffen.       &lt;br /&gt;Als nächstes beschäftigen wir uns mit den Analysis Services Management Objects (kurz AMO), um die Erstellung von OLAP Cubes entweder teilweise oder gar vollständig auf der Basis von Metadaten zu automatisieren. Wir erstellen Dimensionen und Measures. Des Weiteren schaffen wir die Grundlagen für einen eigenen KPI Designer für Cubes. Diese Technologie lässt sich ganz hervorragend kombinieren mit unseren neuen Kenntnissen vom Vortag über dynamisches SSIS. &lt;/li&gt;    &lt;li&gt;SQL Server Reporting Services      &lt;br /&gt;Mit den Reporting Services geht es weiter. Wir entwickeln zuerst eigene Berichtselemente. Des Weiteren beschäftigen wir uns mit der Flexibilität der Reporting Services bei der Umsetzung von Anforderungen für die Integration von Berichten in vorhandene Umgebungen.       &lt;br /&gt;Zwischendurch schauen wir uns noch den Ansatz an die Reporting Services als Benutzeroberfläche zu verstehen und BI entsprechend zu konzeptionieren.       &lt;br /&gt;Auch bei den Reporting Services wenden wir uns zum Abschluss den Möglichkeiten zur automatischen Erstellung und Wartung zu. Wir erstellen gemeinsam Werkzeuge mit denen RDL Dateien (aka Reports) auf Basis von Metadaten erstellt als auch inventarisiert werden können. &lt;/li&gt;    &lt;li&gt;Weboberflächen mit ASP.NET / Ajax      &lt;br /&gt;Zeit sich intensiver mit der Entwicklung von Benutzeroberflächen und Visualisierungen zu beschäftigen. Es gibt Grundlagen für die Erstellung von Weboberflächen mit ASP.NET / Ajax und der Kommunikation mit den SQL Server Diensten via Web Services und WCF. Dann aber experimentieren wir gemeinsam mit GDI+, um erste alternative Visualisierungen umzusetzen.       &lt;br /&gt;Da wir ja nicht alles selbst schreiben wollen, schauen wir uns auch noch das Chart Control des .net Frameworks ein wenig genauer an.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Donnerstag&lt;/strong&gt;, 21.10.2010&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Silverlight     &lt;br /&gt;Heute kommt noch mehr Interaktivität ins Spiel. Mittels Expression Blend entwerfen wir erste Entwürfe für moderne Benutzeroberflächen (RIA) und beschäftigen uns dabei mit der Beschreibungssprache XAML.       &lt;br /&gt;Dann drehen wir das Ganze um und steigen in die Steuerung einer Silverlight Anwendung vom Code aus ein. Nun nehmen wir unsere Erkenntnisse über SSIS, SSRS, ADOMD.NET und AMO und binden diese in unsere Silverlight Anwendungen ein. Damit haben wir auf der einen Seite sehr dynamische Oberflächen und auf der anderen Seite einen Zugriff auf die Dienste des SQL Servers für den Zugriff auf Daten (ADOMD.NET) und die Steuerung der Prozesse zur Verarbeitung (SSIS &amp;amp; AMO) dieser.       &lt;br /&gt;Abschließend entwickeln wir gemeinsam die Grundlagen für einen universellen OLAP Client unter Silverlight, welcher sich flexibel an Anforderungen in Projekten anpassen lässt. &lt;/li&gt;    &lt;li&gt;Erweiterungen für Office &amp;amp; SharePoint 2007/2010      &lt;br /&gt;Nach soviel Neuem wenden uns nun wieder unserem alten Freund Excel zu und erweitern diesen um selbsterstellte Aufgabebereiche für den Zugriff auf Daten und unsere erstellten Dienste.       &lt;br /&gt;Zum Abschluss des Workshops werfen wir noch einen Blick auf den SharePoint Server. Wir entwickeln eigene Webparts, welche wiederum auf unsere Daten und Dienste zugreifen werden. Und wo wir gerade dabei sind, werden wir die SharePoint Search Funktionalität für unsere BI Lösungen zu nutzen lernen.&lt;/li&gt; &lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4205370444845910168?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4205370444845910168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4205370444845910168'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/08/die-website-fur-die-anmeldung-zum-pass.html' title='Die Website für die Anmeldung zum PASS Camp 2010 (R2) ist online!'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-5044139212736981941</id><published>2010-08-04T19:01:00.001+02:00</published><updated>2010-08-04T19:01:56.570+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Microsoft Visual Studio LightSwitch (managed Access?)</title><content type='html'>&lt;p&gt;Bin ja sonst nicht mehr so der Fan von Product-Placement, aber das hier scheint ein paar Zeilen wert zu sein!&lt;/p&gt;  &lt;p&gt;Hier kommt ein neues Visual Studio (Codename Kittyhawk), welches u. a. für den ambitionierten und kreativen Endanwender gedacht sein wird. LightSwitch ist damit das langerwartete “managed Access”!?!&lt;/p&gt;  &lt;p&gt;Es macht einen durchdachten Eindruck, wie da in den Demos SQL Server, SQL Azure, SharePoint usw. mittels einer wirklich einfachen Oberflächen zusammengebracht werden. Ohne es bisher selbst in den Händen gehabt zu haben, kann ich mir trotzdem vorstellen, dass es einen deutlichen Drive in die Entwicklung von diesen kleinen fiesen aber geschäftskritischen Anwendungen bringen wird, welche in diesem Paralleluniversum neben dem ERP System existieren!&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.microsoft.com/visualstudio/en-us/lightswitch" href="http://www.microsoft.com/visualstudio/en-us/lightswitch"&gt;http://www.microsoft.com/visualstudio/en-us/lightswitch&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Die Beta soll ab dem 23. August verfügbar sein.&lt;/p&gt;  &lt;p&gt;Schön ist auch der Claim: “THE SIMPLEST WAY TO BUILD BUSINESS APPLICATIONS FOR THE DESKTOP AND CLOUD”&lt;/p&gt;  &lt;p&gt;We are all in! :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-5044139212736981941?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5044139212736981941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5044139212736981941'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/08/microsoft-visual-studio-lightswitch.html' title='Microsoft Visual Studio LightSwitch (managed Access?)'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-3735168945436136548</id><published>2010-08-03T23:22:00.001+02:00</published><updated>2010-08-03T23:22:14.494+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><title type='text'>Nutzung eines Jobpools in Business Intelligence Umgebungen</title><content type='html'>&lt;p&gt;Da ich vor ein &lt;a href="http://saschalorenz.blogspot.com/2010/07/uberlegungen-uber-den-aufbau-eines.html" target="_blank"&gt;paar Tagen ja über Repositories in Data Warehouse Umgebungen geschrieben&lt;/a&gt; habe, hier noch ein paar weitere Gedanken dazu. Im Rahmen der European PASS Conference 2009 habe ich zwei Vorträge gehalten. In dem einen ging es primär um dynamisch erstellte SSIS Pakete. Eine äußerst leistungsfähige Technologie, wenn in umfangreicheren Projekten eine größere Menge an SSIS Tasks und Paketen benötigt wird, welche auf Basis von Metadaten erzeugt werden sollen. Ein sekundärer Aspekt dieser Session, welcher ein wenig unterging, war die Nutzung eines Jobpools innerhalb eines Repositorys. &lt;/p&gt;  &lt;p&gt;Damit sind wir wieder beim Thema. Es geht mir dabei um die Arbeit mit einer großen Menge an einzelnen Paketen und Jobs, welche zum Beispiel im Rahmen einer Datenbewirtschaftung eines Data Warehouses verarbeitet werden müssen. Natürlich gibt es eine ganze Reihe von Abhängigkeiten, welche bei der Abarbeitung berücksichtigt werden müssen! Als Lösung für eine solche Herausforderung wird gerne die Ablaufsteuerung von SSIS verwendet. Mit dieser lassen sich Abhängigkeiten zwischen einzelnen Paketen sehr leicht visuell modellieren. Dabei werden Jobs in immer der identischen sequentiellen Reihenfolge bzw. parallel abgearbeitet. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TFiIaFElXzI/AAAAAAAAAOo/2JwNEOvKymc/s1600-h/Blog%20Repository%20Folien1%5B7%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Blog Repository Folien1" border="0" alt="Blog Repository Folien1" src="http://lh6.ggpht.com/_1gJtalph07w/TFiIbI61wBI/AAAAAAAAAOs/wSIwcFvOjB8/Blog%20Repository%20Folien1_thumb%5B5%5D.png?imgmax=800" width="435" height="328" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Ein Nachteil dieser Vorgehensweise ist aber die Handhabung in sehr großen Umgebungen, welche auch noch zum Teil dynamisch sind. Wenn dann noch der Wunsch nach automatischer Lastverteilung, Skalierbarkeit und Ausfallsicherheit an die Umgebung gestellt wird, dann kann es schon äußerst komplex werden!&lt;/p&gt;  &lt;p&gt;Als eine mögliche Lösung für dieses Szenario setze ich gerne auf einen sogenannten Jobpool. Dabei werden die einzelnen Aufgaben bzw. Jobs zentral in einem Pool abgelegt. Von “außen” greifen nun sogenannte Agents auf diesen Pool zu und “suchen” sich die Pakete, welche sie verarbeitet werden dürfen. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Blog Repository Folien2" border="0" alt="Blog Repository Folien2" src="http://lh3.ggpht.com/_1gJtalph07w/TFiIcOlGDYI/AAAAAAAAAOw/wIZo5c7NFt4/Blog%20Repository%20Folien2_thumb%5B3%5D.png?imgmax=800" width="439" height="330" /&gt;&lt;/p&gt;  &lt;p&gt;Ob ein Paket aus dem Pool genommen werden darf und verarbeitet werden kann, wird auf Basis von Regeln entschieden. Zum Beispiel kann eine sehr einfache Regel sein, dass erst alle Pakete der Gruppe “ExtraktionCRM” fertig sein müssen, bevor mit der Verarbeitung der “Dimension Kunde” begonnen werden kann. Dabei ist es aber nicht entscheidend, in welchen Reihenfolge die Pakete der Gruppen “ExtraktionCRM” ausgeführt werden. &lt;/p&gt;  &lt;p&gt;Wenn nun ein neuer Job dem Pool hinzugefügt wird, dann muss dieser nicht mit anderen Jobs “verdrahtet” werden, sondern er wird einem Regelsatz zugewiesen. Die Agents, welche die Pakete bzw. Jobs verarbeiten, können für unterschiedliche Aufgaben zur Verfügung stehen. Zum Beispiel dem einfachen Ausführen von SSIS Paketen oder dem Verarbeiten von AMO Anweisungen für den Aufbau von Cubes. Die Agents können über mehrere Server verteilt werden. Dadurch ist eine Lastverteilung und Skalierbarkeit gegeben, ohne, dass eine Ablaufsteuerung manuell an die neue Hardware (welche auch gern virtuell sein kann) angepasst werden muss. Der Ausfall eines Server ist zwar bedauerlich, da seine Leistung fehlt, aber führt nicht mehr zum Abbruch der gesamten Verarbeitung!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TFiIfH_qvCI/AAAAAAAAAO0/KHlnL8E9tOI/s1600-h/Blog%20Repository%20Folien%5B23%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Blog Repository Folien" border="0" alt="Blog Repository Folien" src="http://lh5.ggpht.com/_1gJtalph07w/TFiIhZXD7AI/AAAAAAAAAO4/etE_nbRVqCY/Blog%20Repository%20Folien_thumb%5B15%5D.png?imgmax=800" width="460" height="346" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Wichtig ist mir die Abgrenzung, dass ein Jobpool erst in größeren Umgebungen Sinn macht! In einer überschaubaren Umgebung ist die SSIS Ablaufsteuerung mit ihren Möglichkeiten wesentlich sinnvoller. Der Moment über einen Jobpool nachzudenken ist gekommen, wenn der Verantwortliche für die Datenbewirtschaftung erst ein paar Minuten braucht, um die vermeintlich richtige Stelle in einem Paket zu finden, um einen neuen Job hinzuzufügen. Auch Anforderungen wie Skalierbarkeit, Lastverteilung und Ausfallsicherheit können Treiber für diesen Ansatz sein.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-3735168945436136548?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3735168945436136548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3735168945436136548'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/08/nutzung-eines-jobpools-in-business.html' title='Nutzung eines Jobpools in Business Intelligence Umgebungen'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1gJtalph07w/TFiIbI61wBI/AAAAAAAAAOs/wSIwcFvOjB8/s72-c/Blog%20Repository%20Folien1_thumb%5B5%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-8028825085049577847</id><published>2010-08-01T18:40:00.001+02:00</published><updated>2010-08-01T18:40:59.868+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Die verwendeten Spalten und Tabellen einer beliebig komplexen SQL Query ermitteln</title><content type='html'>&lt;p&gt;Mein &lt;a href="http://saschalorenz.blogspot.com/2010/07/uberlegungen-uber-den-aufbau-eines.html" target="_blank"&gt;letzter Blogeintrag zum Thema Repository im Data Warehouse&lt;/a&gt; scheint einige Fragen aufgeworfen zu haben! &lt;/p&gt;  &lt;p&gt;Neben dem eigentlichen Thema “Repository”, danke für die Rückmeldungen, kam oft die Frage, wie ich denn nun aus einer SQL Query die in dieser verwendeten Spalten der Quelltabellen auslese und was der Queryplan damit zu tun hat. Daher hier jetzt ein paar mehr Informationen dazu.&lt;/p&gt;  &lt;p&gt;Die Vorgehensweise ist ein Abfallprodukt aus der Entwicklung eines Performancetuning Tools in einem Projekt.&lt;/p&gt;  &lt;p&gt;Kurz zur Sicherheit erwähnt, wofür ich sowas in Projekten überhaupt benötige. Es geht um die Aufgabenstellung, dass ich hunderte von Queries habe und sehr gerne “auf-Knopfdruck” sehen möchte, welchen Einfluss eine Änderung am Datenmodell auf eben diese Queries hätte. Woher habe ich diesen Berg Abfragen? Entweder aus einem Profiler Trace einer OLTP Anwendung oder aus RDL-Dateien. Auch schon gemacht, daher hier als möglich aufgezählt, die Quellen in SSIS Paketen und Analysis Services Projekten. Auf jeden Fall sind die von einer Lösung verwendeten Queries immer gute Kandidaten in einem entsprechenden Repository gespeichert zu werden.&lt;/p&gt;  &lt;p&gt;Gerne empfehle ich ISVs auch ein solches Repository als Grundlage einer Dokumentation zu führen und vor Änderungen am Datenmodell wie hier beschrieben vorzugehen. Damit fängt ein gutes Qualitätsmanagement doch erst an. Das Performancetuning kann dann gleich “daneben” gepflegt werden. So sah übrigens das ursprüngliche Projekt aus.&lt;/p&gt;  &lt;p&gt;Die Aufgabenstellung nach den verwendeten Spalten hatte ich schon oft, aber häufig ist der erste Gedanke der Kunden, dass man dafür doch einen separaten SQL Parser bräuchte. Nun ja, sicherlich machbar, also mit entsprechend Zeit usw., aber nutzen wir doch den SQL Server als Tool dafür!&lt;/p&gt;  &lt;p&gt;Nehmen wir mal eine einfache Query für das AdventureWorksDW2008&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select SUM(salesamount) as summe       &lt;br /&gt;from dbo.FactInternetSales f        &lt;br /&gt;left join dbo.DimCustomer c on f.CustomerKey = c.CustomerKey        &lt;br /&gt;where c.HouseOwnerFlag = '0'&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Mittels &lt;strong&gt;SET SHOWPLAN_XML ON&lt;/strong&gt; bringe ich den SQL Server dazu, dass dieser…&lt;/p&gt;  &lt;p&gt;a.) die Query nicht ausführt   &lt;br /&gt;b.) mir den geschätzten Ausführungsplan im XML Format liefert&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TFWjZwcRkqI/AAAAAAAAAOE/2Eo70P7yVkg/s1600-h/image%5B16%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TFWjbhBhRKI/AAAAAAAAAOI/MZSHDL1IMg0/image_thumb%5B10%5D.png?imgmax=800" width="531" height="298" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Schon mal total toll. Nur bringt es mich überhaupt nicht weiter, da ich den Prozess ja automatisieren möchte. Also Management Studio zu, Visual Studio auf und ein wenig C#.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;SqlConnection con = new SqlConnection(&amp;lt;ConnectionString&amp;gt;);       &lt;br /&gt;con.Open();        &lt;br /&gt;SqlCommand showplan_on = new SqlCommand(&amp;quot;set showplan_xml on&amp;quot;, con);        &lt;br /&gt;showplan_on.ExecuteNonQuery(); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;SqlCommand query = new SqlCommand(&amp;lt;Query&amp;gt;, con);       &lt;br /&gt;SqlDataReader showplan_results = query.ExecuteReader();        &lt;br /&gt;if (showplan_results.Read())        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; tbOutput.Text = showplan_results[0].ToString();         &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;showplan_results.Close(); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;SqlCommand showplan_off = new SqlCommand(&amp;quot;set showplan_xml off&amp;quot;, con);       &lt;br /&gt;showplan_off.ExecuteNonQuery();        &lt;br /&gt;con.Close();&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TFWje0CNObI/AAAAAAAAAOM/LBHWaWK970U/image_thumb%5B3%5D.png?imgmax=800" width="627" height="419" /&gt;&lt;/p&gt;  &lt;p&gt;Und schon habe ich den geschätzten Ausführungsplan erhalten und zwar ohne, dass meine Query ausgeführt wurde! &lt;/p&gt;  &lt;p&gt;Mit so einem Ausführungsplan kann man nun sehr spannende Sachen machen, aber für unseren Fall hier interessieren uns nur die Elemente mit dem Namen &lt;strong&gt;&lt;em&gt;ColumnReference&lt;/em&gt;&lt;/strong&gt;. Da stecken nämlich unsere Spalten drin. Wie kommen wir da nun ran? Der Ausführungsplan ist bereits geladen. Aber er ist noch als String verpackt. Das kann das .net Framework aber besser, daher nix wie ab in eine XML Datenstruktur und die Elemente gesucht.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;XmlDocument dom = new XmlDocument();       &lt;br /&gt;dom.LoadXml(tbOutput.Text);&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;XmlElement root = dom.DocumentElement; &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;XmlNamespaceManager nsmgr = new XmlNamespaceManager(dom.NameTable);       &lt;br /&gt;nsmgr.AddNamespace(&amp;quot;bk&amp;quot;, &amp;quot;&lt;/em&gt;&lt;/strong&gt;&lt;a href="http://schemas.microsoft.com/sqlserver/2004/07/showplan&amp;quot;);"&gt;&lt;strong&gt;&lt;em&gt;http://schemas.microsoft.com/sqlserver/2004/07/showplan&amp;quot;);&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;XmlNodeList nodelist = root.SelectNodes(&amp;quot;//bk:ColumnReference[@Database]&amp;quot;, nsmgr);&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Und wir haben eine NodeList mit unseren Elementen! Diese können wir nun ausgeben. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;xn.Attributes.GetNamedItem(&amp;quot;Database&amp;quot;).InnerText + &amp;quot;.&amp;quot; + xn.Attributes.GetNamedItem(&amp;quot;Schema&amp;quot;).InnerText + &amp;quot;.&amp;quot; + xn.Attributes.GetNamedItem(&amp;quot;Table&amp;quot;).InnerText + &amp;quot;.[&amp;quot; + xn.Attributes.GetNamedItem(&amp;quot;Column&amp;quot;).InnerText + &amp;quot;]&amp;quot;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Da haben wir unsere Spalten! War doch ganz einfach, oder?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TFWjfiH9-BI/AAAAAAAAAOQ/xS-dYDP0T-Q/s1600-h/image%5B10%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TFWjhRqOMQI/AAAAAAAAAOU/6fiS5A7fkL4/image_thumb%5B6%5D.png?imgmax=800" width="465" height="175" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Und das funktioniert dann natürlich nicht nur mit SELECT Statements! Hier mal ein Beispiel für ein UPDATE Statement mit Unterabfragen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TFWjh9sJ7ZI/AAAAAAAAAOY/6CQc1zuMdOk/s1600-h/image%5B22%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TFWjj5hprDI/AAAAAAAAAOc/eQIOKFcb3Yo/image_thumb%5B14%5D.png?imgmax=800" width="510" height="280" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ergibt folgende Ausgabe:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TFWjkRFKQ8I/AAAAAAAAAOg/i74qM6q_2No/s1600-h/image%5B28%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TFWjmpR4eoI/AAAAAAAAAOk/0PtVSJwvjPE/image_thumb%5B18%5D.png?imgmax=800" width="507" height="250" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Mit dieser Vorlage sollte sich eigentlich jeder sein eigenes Tool für diese Art von Fragestellung bauen können. Viel Spaß damit!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-8028825085049577847?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8028825085049577847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8028825085049577847'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/08/die-verwendeten-spalten-und-tabellen.html' title='Die verwendeten Spalten und Tabellen einer beliebig komplexen SQL Query ermitteln'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1gJtalph07w/TFWjbhBhRKI/AAAAAAAAAOI/MZSHDL1IMg0/s72-c/image_thumb%5B10%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-734328032527287056</id><published>2010-07-29T18:56:00.001+02:00</published><updated>2010-07-29T18:56:49.097+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Überlegungen über den Aufbau eines Repositorys in einer Business Intelligence Umgebung</title><content type='html'>&lt;p&gt;Ein kürzlich geführtes Gespräch mit einem Community Kollegen über das Thema Repositorys in Microsoft Business Intelligence Umgebungen, brachte mich auf die Idee meine Überlegungen und Erfahrungen zu dem Thema hier mal kurz zu skizzieren.&lt;/p&gt;  &lt;p&gt;Meine Definition eines Repositorys ist eine zentrale Sammlung von Metadaten, Versionsständen und Protokollen. Ein solches Repository gehört meiner Meinung nach primär zu dem Themenkomplex Data Warehouse. &lt;/p&gt;  &lt;p&gt;Das Versprechen einer Business Intelligence Lösung bzw. eines Data Warehouses ist u. a. die Bereitstellung der sogenannten “einzigen Wahrheit” in der Organisation. Das ist zum Beispiel durch den Einsatz von OLAP Cubes technisches relativ leicht durchzusetzen. Alle weiteren Frontend Werkzeuge (zum Beispiel Reporting Services oder Excel) greifen auf diese Datenquellen zu. Was passiert aber nun, wenn sich Strukturen des Data Warehouses und/oder der OLAP Cubes verändern? Diese Veränderungen ziehen sich in der Regel bis zu den Frontends durch und haben sehr wahrscheinlich auch Einfluss auf die schon bereitgestellten Reports in Reporting Services und Excel. &lt;/p&gt;  &lt;p&gt;In einer klassischen Microsoft Business Intelligence Umgebung greifen die Dienste direkt auf die jeweils anderen Dienste zu. &lt;/p&gt;  &lt;p&gt;&lt;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="Präsentation1" border="0" alt="Präsentation1" src="http://lh3.ggpht.com/_1gJtalph07w/TFGypiv3gVI/AAAAAAAAANs/rorEByJ-BFI/Pr%C3%A4sentation1_thumb%5B7%5D.png?imgmax=800" width="478" height="360" /&gt;&lt;/p&gt;  &lt;p&gt;Die Dienste des SQL Servers sind technisch gesehen eigenständig. In einer BI Lösung werden diese zwar miteinander verbunden, aber diese Kopplung ist recht lose. Auf der einen Seite sind damit äußerst flexible Architekturen möglich, auf der anderen Seite gibt es kein zentrales Element, welches die Kommunikation zwischen den Diensten steuert. Szenarien, wie das oben geschilderte, werden durch keine Architekturschicht “aufgefangen”.&lt;/p&gt;  &lt;p&gt;Die Verwendung eines zentralen Repositorys, welches zwischen den Dienste steht, unterstützt die Business Intelligence Umgebung dabei das Versprechen einer einzigen Wahrheit nachhaltig einzulösen.&lt;/p&gt;  &lt;p&gt;&lt;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="Präsentation1" border="0" alt="Präsentation1" src="http://lh4.ggpht.com/_1gJtalph07w/TFGyqGl2dtI/AAAAAAAAANw/r_YzAx3S4XU/Pr%C3%A4sentation1_thumb%5B11%5D.png?imgmax=800" width="479" height="360" /&gt;&lt;/p&gt;  &lt;p&gt;Die Technologie hinter einem solchem Repository ist in unseren Projekten die relationale Engine des SQL Servers. Die notwendige Flexibilität gibt mir aber die Kombination aus strukturierten und semi-strukturierten Daten. Ein Ziel ist es, dass im Projekt als auch bei der späteren Verwendung der Business Intelligence Umgebung nicht mehr an unterschiedlichen Orten nach Informationen gesucht werden muss, sondern, dass gezielt das Repository genutzt werden kann.&lt;/p&gt;  &lt;p&gt;Bereits während der Einführung einer Business Intelligence Lösung sollte daher auf den konsequenten Aufbau eines durchgängigen Repositorys geachtet werden.&lt;/p&gt;  &lt;p&gt;Das ist zwar jetzt sehr theoretisch, aber gehen wir mal bei einem Beispiel ein wenig ins Detail. Die Reporting Services sind ein sehr leistungsfähiger Dienst. Die Definition der Reports liegen in sogenannten RDL-Dateien vor. Als Beschreibungssprache wird die &lt;strong&gt;R&lt;/strong&gt;eport &lt;strong&gt;D&lt;/strong&gt;efinition &lt;strong&gt;L&lt;/strong&gt;anguage verwendet. Diese ist auch sauber von Microsoft dokumentiert. &lt;/p&gt;  &lt;p&gt;Innerhalb einer RDL-Datei wird auf eine Datenquelle verwiesen, welche gesondert beschrieben wird. Aber die eigentliche Definition der verwendeten Felder innerhalb des Reports ergibt sich im Report direkt aus dem CommandText der Query und den definierten Feldern. Es ist mit Hausmitteln später nicht mehr einfach herauszufinden, woher die Felder im Report kommen. Dazu müsste die Query analysiert werden (komme ich noch zu). Auch das neue Feature der Shared datasets bringt hierfür nicht wirklich etwas (sonst äußerst praktisch!), da es nur eine weitere Abstraktionsebene zwischen Report und Datenquelle zieht, aber keine eindeutiges Mapping der Felder zu Tabellen (oder Cubes) zulässt. Hier mal ein Blick direkt in eine RDL-Datei. Wir sehen die Query und die einzelnen Felder, aber kein Mapping!&lt;/p&gt;  &lt;p&gt;&lt;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://lh6.ggpht.com/_1gJtalph07w/TFGyqgOaxvI/AAAAAAAAAN0/9JJZMt8iIR4/image_thumb%5B8%5D.png?imgmax=800" width="526" height="496" /&gt;&lt;/p&gt;  &lt;p&gt;Eine konkrete Überlegung für das Repository ist, dass dieses Mapping aber für Impact-Analysen auf jeden Fall stattfinden muss. Wie kann sowas nun realisiert werden? &lt;/p&gt;  &lt;p&gt;Im Falle einer relationalen Quelle, also zum Beispiel des direkten Zugriffs von Reports auf das Data Warehouse, lässt sich das recht einfach mittels automatischer generierter Views lösen. Das Data Warehouse stellt über das Repository, als eine Art Presentation Layer, eine Reihe von Views bereit, welche in den Reports verwendet werden können. Wichtig ist dabei, dass die Flexibilität nicht künstlich beschnitten wird. Es sollte auch nicht verschwiegen werden, dass es durchaus Möglichkeiten gibt auf Basis der Query innerhalb eines Reports an die verwendeten Tabellen und Views zu kommen. Realisierbar ist das mit einer Mischung aus RDL-Datei auslesen und Queryplan abfragen! Damit bringen uns selbst Sub-Queries und geschachtelte Views nicht um den Verstand! :-)&lt;/p&gt;  &lt;p&gt;Bei einer multidimensionalen Quelle, also einem OLAP Cube, ist es leider nicht ganz so einfach. Da haben wir out-of-the-box keine Views, die wir dafür verwenden können. Um dieser Herausforderung Herr zu werden, macht es Sinn sich mit AMO zu beschäftigen. Den &lt;strong&gt;A&lt;/strong&gt;nalysis (Services) &lt;strong&gt;M&lt;/strong&gt;anagement &lt;strong&gt;O&lt;/strong&gt;bjects. Mittels dieses praktischen Frameworks können Cubes auf Basis unserer Metadaten aus dem Repository automatisiert erzeugt werden. Damit haben wir zumindest eine zuverlässige und saubere Datenbasis, auf welcher wir dann aufsetzen können mit den Frontends. Die Metadaten, welche AMO nutzt, greifen zum Beispiel wiederum auf die oben erwähnten Views des Data Warehouses zu.&lt;/p&gt;  &lt;p&gt;Wie Ihr seht gibt es durchaus Anwendungsfälle für ein Repository im Rahmen eines Business Intelligence Projektes!&lt;/p&gt;  &lt;p&gt;Ein Repository wird bei der Erstellung eines ersten Prototypen einer Business Intelligence Lösung bzw. Umgebung aber meist als überflüssig empfunden. Vielleicht entsteht sogar der Verdacht, dass der Berater künstlich zusätzlichen Zeitaufwand generieren möchte und keinen echten Gegenwert dafür liefert. Dabei gibt es ja eine ganze Reihe von sehr guten Gründen für den Einsatz einer solchen Architektur!&lt;/p&gt;  &lt;p&gt;Ein guter Ansatz ist es wesentlich mehr Aufmerksamkeit (und das ist nicht zu verwechseln mit Zeit!) in die Pflege der verwendeten Quellen zu legen. Wenn es geschafft wird die Quellen als eigenständige Objekte zu verstehen, welche entsprechend auch für sich gepflegt werden, dann ist das Projekt meist auf einem guten Weg. Im Rahmen eines standardisierten Deployment Prozesses sollten später neue Objekte auch direkt in das Repository aufgenommen werden.&lt;/p&gt;  &lt;p&gt;Ich denke, dass ich mit Sicherheit auf dem &lt;a href="http://www.passcamp.de" target="_blank"&gt;PASS Camp&lt;/a&gt; im Oktober das eine oder andere zu diesem Thema zeigen werde. Wir werden zum Beispiel RDL-Dateien auseinandernehmen und uns eigene AMO Prozesse codieren.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-734328032527287056?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/734328032527287056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/734328032527287056'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/uberlegungen-uber-den-aufbau-eines.html' title='Überlegungen über den Aufbau eines Repositorys in einer Business Intelligence Umgebung'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/TFGypiv3gVI/AAAAAAAAANs/rorEByJ-BFI/s72-c/Pr%C3%A4sentation1_thumb%5B7%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-7806088629643526704</id><published>2010-07-24T17:28:00.001+02:00</published><updated>2010-07-24T17:28:59.521+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>ADOMD.NET und die CellSet Klasse</title><content type='html'>&lt;p&gt;So, als eine Ergänzung zu meinen &lt;a href="http://saschalorenz.blogspot.com/2010/07/erste-schritte-mit-adomdnet.html" target="_blank"&gt;letzten Einträgen&lt;/a&gt; zum Thema ADOMD.NET, habe ich heute ein paar weitere Details zur CellSet Klasse.&lt;/p&gt;  &lt;p&gt;Ich hatte ja bereits gezeigt, wie Ihr generell mittels ADOMD.NET und der CellSet Klasse auf Daten eines Cube zugreifen könnt. Dazu hatte ich auch ein paar Eigenschaften und Methoden der CellSet Klasse erläutert. Hier nun ein Beispiel für den Zugriff auf ein Resultset innerhalb eines CellSets.&lt;/p&gt;  &lt;p&gt;Hier nochmal ein Stück Code, welches sich mit einem Analysis Services Cube verbindet und eine MDX Query ausführt.&lt;/p&gt; &lt;strong&gt;&lt;em&gt;AdomdConnection mdcon = new AdomdConnection(“&amp;lt;ConnectionString&amp;gt;”);&lt;/em&gt;    &lt;br /&gt;&lt;/strong&gt;&lt;em&gt;&lt;strong&gt;mdcon.Open();      &lt;br /&gt;AdomdCommand cmd = mdcon.CreateCommand();       &lt;br /&gt;cmd.CommandText = “Query”;       &lt;br /&gt;CellSet cs = cmd.ExecuteCellSet();       &lt;br /&gt;mdcon.Close();&lt;/strong&gt;&lt;/em&gt;  &lt;p&gt;Entscheidend für uns ist hier das CellSet cs, welches wir nun ein wenig mehr “auseinandernehmen” werden!&lt;/p&gt;  &lt;p&gt;Dafür brauchen wir aber auch die MDX Query:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;SELECT        &lt;br /&gt;{[Date].[Calendar].[Calendar Year].&amp;amp;[2003], [Date].[Calendar].[Calendar Year].&amp;amp;[2004]} on Columns,         &lt;br /&gt;NON EMPTY CROSSJOIN({[Product].[Product Categories].[All Products].children}, {[Customer].[Customer Geography].[All Customers].children}) on Rows         &lt;br /&gt;FROM [Adventure Works]         &lt;br /&gt;WHERE ([Measures].[Internet Sales Amount])&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Wir sind mal wieder auf “Adventure Works” unterwegs. Hier lassen wir uns für die Jahre 2003 und 2004 die Internet Umsätze aufgeschlüsselt nach Produktkategorien und Kundenregionen darstellen.&lt;/p&gt;  &lt;p&gt;Das Ergebnis können wir uns so vorstellen:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TEsGeIUfd-I/AAAAAAAAANc/NUYvecmvKJc/s1600-h/image%5B3%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/TEsGhA63KkI/AAAAAAAAANg/3c2D3Lhrc44/image_thumb%5B1%5D.png?imgmax=800" width="483" height="401" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nur wie kommen wir jetzt mittels des CellSet Objektes cs an die einzelnen Zellen? Um das mal anschaulich darzustellen, habe ich hier für das Resultset von oben die jeweiligen “Pfade” durch das Objekt zu den Daten und Überschriften aufgeführt.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TEsGlPZ9S7I/AAAAAAAAANk/kWBP2gSe4Bs/s1600-h/image%5B13%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TEsGuchJaTI/AAAAAAAAANo/vHRm_E2k0S8/image_thumb%5B7%5D.png?imgmax=800" width="1088" height="365" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Das ist ja schon mal übersichtlich. Nur was sind jetzt diese ganzen Auflistungen und Objekte? &lt;/p&gt;  &lt;p&gt;Fangen wir einfach an. Bei der Aufbereitung eines CellSets sollten wir uns zunächst fragen: Wie viele Achsen hat das Resultset? Wer sich mit MDX schon mal beschäftigt hat, weiß ja, dass durchaus mehr als nur zwei Achsen möglich sind. Sowas sollten wir abfangen!&lt;/p&gt;  &lt;p&gt;Also mit &lt;em&gt;&lt;strong&gt;cs.axes.count&lt;/strong&gt;&lt;/em&gt; kommen wir an die Anzahl der Achsen. &lt;/p&gt;  &lt;p&gt;Von der Achse aus kommen wir zur Auflistung Positions, welche uns zu den Tuples der jeweiligen Achse bringt. Unterhalb der Positions haben wir die Members. Hier müssen wir klären, wie viele Members wir haben. Also kommt hier zum Beispiel ein &lt;strong&gt;&lt;em&gt;cs.Axes[1].Positions[0].Members.Count. &lt;/em&gt;&lt;/strong&gt;Damit können wir die Beschriftung oben und an der Seite durchführen. Wenn wir uns den UniqueName mit merken, können wir auch bereit sein für weitere Filtervorgänge.&lt;/p&gt;  &lt;p&gt;An die eigentliche Werte kommen wir sehr einfach. Wir nehmen das CellSet und adressieren die jeweilige Position innerhalb des Resultsets direkt. Oben im Beispiel seht Ihr das Verfahren sehr deutlich! Und schon haben wir alles Wesentliche vom Resultset ausgelesen.&lt;/p&gt;  &lt;p&gt;Schaut doch eigentlich ganz einfach aus, oder?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-7806088629643526704?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7806088629643526704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7806088629643526704'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/adomdnet-und-die-cellset-klasse.html' title='ADOMD.NET und die CellSet Klasse'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_1gJtalph07w/TEsGhA63KkI/AAAAAAAAANg/3c2D3Lhrc44/s72-c/image_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-3804530366313049801</id><published>2010-07-22T22:23:00.001+02:00</published><updated>2010-07-22T22:23:59.982+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Analysis Services Metadata mittels ADOMD.NET auslesen</title><content type='html'>&lt;p&gt;Ok, &lt;a href="http://saschalorenz.blogspot.com/2010/07/erste-schritte-mit-adomdnet.html" target="_blank"&gt;mein Blogartikel über ADOMD.NET&lt;/a&gt; war ja auch nur als Einstieg und Anregung gedacht! Aber es kamen nun die Wünsche nach Beispielen und Demos. Daher heute mal ein wenig Democode inkl. &lt;a href="http://www.sascha-lorenz.de/downloads/ADOMD.NETMetadataSample.zip" target="_blank"&gt;Download&lt;/a&gt;. Ich hoffe, dass ich in den nächsten Tagen noch mehr dazu beisteuern kann.&lt;/p&gt;  &lt;p&gt;Also, ich habe ein kleines Beispiel in WinForms gebaut, welches die Metadaten aus einer Verbindung mit den Analysis Services ausliest und in einem TreeView darstellt. Das ist jetzt bewusst keine fertige BI Anwendung, sondern soll als Beispiel für den Zugriff auf besagte Metadaten dienen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TEiox3kPccI/AAAAAAAAANM/hTVA53SaHfE/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TEio0golfaI/AAAAAAAAANQ/ob8E5tPirHg/image_thumb%5B3%5D.png?imgmax=800" width="463" height="534" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wichtig ist, dass Ihr auf Eurem Rechner eine ADOMD.NET DLL habt. Sprich Ihr solltet ADOMD.NET installiert haben!&lt;/p&gt;  &lt;p&gt;Der eigentliche Code ist recht “einfach” gehalten und hält sich mit wenig auf. Es geht hier ja auch um ein erstes Demo.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int nCubes = 0; &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tvMetadata.Nodes.Clear(); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AdomdConnection mdcon = new AdomdConnection(tbConnString.Text);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mdcon.Open(); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (CubeDef cube in mdcon.Cubes)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (cube.Name.StartsWith(&amp;quot;$&amp;quot;))        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; continue;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tvMetadata.Nodes.Add(cube.Name + &amp;quot; (&amp;quot; + cube.LastProcessed.ToString() + &amp;quot;)&amp;quot;); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tvMetadata.Nodes[nCubes].Nodes.Add(&amp;quot;Measures&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (Measure mes in cube.Measures)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tvMetadata.Nodes[nCubes].Nodes[0].Nodes.Add(mes.Name); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tvMetadata.Nodes[nCubes].Nodes.Add(&amp;quot;Dimensionen&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int nDims = 0;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (Dimension dim in cube.Dimensions)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tvMetadata.Nodes[nCubes].Nodes[1].Nodes.Add(dim.Name); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach(Hierarchy hier in dim.Hierarchies)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tvMetadata.Nodes[nCubes].Nodes[1].Nodes[nDims].Nodes.Add(hier.Name);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nDims++;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tvMetadata.Nodes[nCubes].Nodes.Add(&amp;quot;KPIs&amp;quot;);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (Kpi kpi in cube.Kpis)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; tvMetadata.Nodes[nCubes].Nodes[2].Nodes.Add(kpi.Name); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nCubes++;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mdcon.Close(); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Mehr ist für das Darstellen der Metadaten eines Cubes erst mal nicht notwendig! &lt;/p&gt;  &lt;p&gt;Eine mögliche Erweiterung wäre sich neben den sprechenden Bezeichnungen auch gleich noch die UniqueNames ausgeben zu lassen bzw. zu speichern. Dafür müsst Ihr statt “Name” nur “UniqueName” verwenden. Hier mal ein Beispiel wie sowas auf der Ebene der Hierarchien aussehen kann.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TEio1oFlGYI/AAAAAAAAANU/80R21eIgNrg/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TEio3Y6oFqI/AAAAAAAAANY/LcPppCSq4C4/image_thumb%5B7%5D.png?imgmax=800" width="492" height="107" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Des Weiteren ignoriere ich zurzeit komplett die DisplayFolder, diese könnten natürlich auch eingebaut werden. Also da ist noch Raum für Kreativität. Und bevor ich es vergesse, dieses Demo und viele weitere gibt es auf dem kommenden &lt;a href="http://www.passcamp.de" target="_blank"&gt;PASSCamp 2010&lt;/a&gt; in meinem Track!&lt;/p&gt;  &lt;p&gt;Das Projekt gibt es als Download genau hier: &lt;a title="http://www.sascha-lorenz.de/downloads/ADOMD.NETMetadataSample.zip" href="http://www.sascha-lorenz.de/downloads/ADOMD.NETMetadataSample.zip"&gt;http://www.sascha-lorenz.de/downloads/ADOMD.NETMetadataSample.zip&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-3804530366313049801?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3804530366313049801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/3804530366313049801'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/analysis-services-metadata-mittels.html' title='Analysis Services Metadata mittels ADOMD.NET auslesen'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_1gJtalph07w/TEio0golfaI/AAAAAAAAANQ/ob8E5tPirHg/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-7131547559924483985</id><published>2010-07-19T21:35:00.001+02:00</published><updated>2010-07-19T21:35:17.061+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Microsoft SQL Server 2008 R2 Update for Developers Training Course</title><content type='html'>&lt;p&gt;Es gibt auf Basis des &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=fffaad6a-0153-4d41-b289-a3ed1d637c0d" target="_blank"&gt;SQL Server 2008 R2 Update for Developers Training Kit&lt;/a&gt; nun auch noch auf Channel9 einen passenden Kurs in Form von Webcasts!&lt;/p&gt;  &lt;p&gt;Also, hier geht es zum &lt;a href="http://channel9.msdn.com/learn/courses/SQL2008R2TrainingKit/" target="_blank"&gt;Microsoft SQL Server 2008 R2 Update for Developers Training Course&lt;/a&gt; ! :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-7131547559924483985?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7131547559924483985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/7131547559924483985'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/microsoft-sql-server-2008-r2-update-for.html' title='Microsoft SQL Server 2008 R2 Update for Developers Training Course'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-1154101295270271925</id><published>2010-07-17T17:38:00.001+02:00</published><updated>2010-07-17T17:38:41.908+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><title type='text'>PivotViewer Extension for Reporting Services CTP1</title><content type='html'>&lt;p&gt;Vielleicht erinnert Ihr Euch noch an Pivot? &lt;a href="http://saschalorenz.blogspot.com/2010/02/und-noch-ein-pivot.html" target="_blank"&gt;Ich hatte schon mal kurz drüber geschrieben.&lt;/a&gt; Dazu ist mittlerweile einiges passiert. &lt;/p&gt;  &lt;p&gt;Es gibt nun ein &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=9a1bb862-d80c-4145-9320-b279a63bff91" target="_blank"&gt;PivotViewer Silverlight Control als Download&lt;/a&gt;, welches Ihr auf Euren Seiten einsetzen könnt!&lt;/p&gt;  &lt;p&gt;Aber was noch cooler wird, ist die Tatsache, dass Microsoft nun für den SharePoint 2010 ebenfalls eine Erweiterung, welche auf dem Control basiert, als CTP auf der Straße. Diese wird zwar als Designstudie bezeichnet, aber das wirkt schon durchdacht für den Moment.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/TEHOb3UiATI/AAAAAAAAANE/GMCF4lWUZ5Y/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/TEHOgNmHBNI/AAAAAAAAANI/dlq3gGljrzo/image_thumb%5B2%5D.png?imgmax=800" width="474" height="349" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Den Download der “PivotViewer Extension for Reporting Services CTP1” gibt es hier: &lt;a title="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=d31f609d-a353-41ad-a1a4-f81456e3a6c4" href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=d31f609d-a353-41ad-a1a4-f81456e3a6c4"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=d31f609d-a353-41ad-a1a4-f81456e3a6c4&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Den Blog zum Projekt und einer sehr nützlichen Anleitung für die Installation hier: &lt;a title="http://petcu40.blogspot.com/2010/07/pivotviewer-extension-for-reporting.html" href="http://petcu40.blogspot.com/2010/07/pivotviewer-extension-for-reporting.html"&gt;http://petcu40.blogspot.com/2010/07/pivotviewer-extension-for-reporting.html&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-1154101295270271925?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1154101295270271925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1154101295270271925'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/pivotviewer-extension-for-reporting.html' title='PivotViewer Extension for Reporting Services CTP1'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_1gJtalph07w/TEHOgNmHBNI/AAAAAAAAANI/dlq3gGljrzo/s72-c/image_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-1715163374530572640</id><published>2010-07-17T11:57:00.001+02:00</published><updated>2010-07-17T11:57:25.264+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Erste Schritte mit ADOMD.NET</title><content type='html'>&lt;p&gt;In den letzten Jahren habe ich eine ganze Reihe von Vorträgen über den Zugriff auf Analysis Services Cubes mittels .net Code und ADOMD.NET gehalten. Da die Funktionsweise eigentlich äußert einfach ist, habe ich aber bisher wenig bis wohl gar nichts dazu geschrieben. Das möchte ich nun nachholen, da sich hier bei mir die Nachfragen langsam häufen! :-) &lt;/p&gt;  &lt;p&gt;Also, was ist ADOMD.NET eigentlich, was kann das und kostet das was? &lt;/p&gt;  &lt;p&gt;ADOMD.NET ist ein sogenannter Data Provider von Microsoft für das .net Framework und bietet u. a. aus meiner .net Anwendung heraus die Möglichkeit auf SQL Server Analysis Services Cubes zuzugreifen. Wichtig ist dabei zu verstehen, dass ADOMD.NET kein fertiges BI Tool oder Control ist, welches ich nur noch einbinden muss und damit eine Art Excel-BI-Grid-GUI in meiner Anwendung habe. ADOMD.NET bietet mir im Code alle Möglichkeiten für den Zugriff auf die Daten, aber ich muss diese selbst kreativ nutzen . Wäre es dann nicht einfacher sich nicht gleich was Fertiges zu kaufen? Ok, wer schon mal eine Session von mir zum Thema gesehen hat, der kennt meine Antwort darauf. In der Regel wollen wir ja nicht den x’ten BI Client schreiben (auch wenn das wirklich Spaß machen kann!) oder unsere Anwendung um das Look &amp;amp; Feel von Excel erweitern, sondern unsere Anwender auf intelligente Art und Weise von den Fähigkeiten eines wahrscheinlich eh schon existierenden Cubes profitieren lassen. Mit Fähigkeiten meine u. a. ich die Flexibilität und Performance in Bezug auf sogenannte Ad-Hoc Queries und die damit verbundenen fast schon magischen Berechnungsmöglichkeiten. Das mit SQL Queries auf einer relationalen Datenbank abzubilden ist zwar meist möglich, aber dazu ist schon einiges an Experten KnowHow erforderlich und an die Performance eines Cubes ist meist gar nicht zu denken. Es lässt sich halt nicht jede Ad-Hoc Query vorher mit einem entsprechenden Index vorbereiten. Liegt nun mal in der Natur der Sache mit diesen Ad-Hoc Abfragen! Kommen wir kurz zu den Kosten. Good news, ADOMD.NET gibst von Microsoft zum SQL Server einfach dazu und ist Bestandteil des Feature Packs. Für den Zugriff wird nur eine gültige Lizenz für den Client benötigt. Also, wenn es aus lizenztechnischer Sicht möglich ist Excel als Client zu nutzen für die SSAS, dann auch ADOMD.NET. Details zu Lizenzen gibst bei Eurem freundlichen Microsoft Kontakt! Ach ja, Feature Packs! Hier kurz die Links, falls Ihr die nicht zur Hand habt:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=de&amp;amp;FamilyID=ceb4346f-657f-4d28-83f5-aae0c5c83d52" target="_blank"&gt;Microsoft SQL Server 2008 R2 Feature Pack&lt;/a&gt;, &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=de&amp;amp;FamilyID=b33d2c78-1059-4ce2-b80d-2343c099bcb4" target="_blank"&gt;Microsoft SQL Server 2008 Feature Pack&lt;/a&gt; &amp;amp; &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=50b97994-8453-4998-8226-fa42ec403d17&amp;amp;displaylang=de" target="_blank"&gt;Microsoft SQL Server 2005 Feature Pack&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wie Ihr seht, gibst das Feature Pack für jede aktuellere Version des SQL Servers. Alles was ich Euch hier über ADOMD.NET schreibe, sollte auch mit jeder dieser Versionen möglich sein. Falls jemand andere Erfahrungen macht, dann Feedback an mich bitte.&lt;/p&gt;  &lt;p&gt;Ok, auf was für Daten können wir nun in so einem Cube zugreifen? Ohne jetzt einen Grundlagenartikel über SSAS Cubes zu schreiben, hier mal kurz das Wichtigste kurz zusammengefasst:&lt;/p&gt;  &lt;p&gt;Ein Cube besteht aus Dimensionen und Measures. Dabei könnt Ihr Euch die Dimensionen aus Geschäftsobjekte vorstellen und die Measures als die damit verbundenen Geschäftsprozesse bzw. die Ergebnisse der Geschäftsprozesse. Ein einfaches Beispiel ist der Verkauf von Artikel, dabei sind die Geschäftsobjekte “Artikel” und “Kunden” vorhanden und der Prozesse “Verkauf” und die damit verbundenen Umsätze. Nun kann in einem Cube entweder die Summe aller getätigten Verkäufe betrachtet werden oder diese werden auf Basis der Geschäftsobjekte gefiltert. Menschen mit einem Business Intelligence Hintergrund sprechen auch gern von dem “Schneiden” von Daten. Also zeige mir zum Beispiel nur die Verkäufe für die Artikelgruppen A, B &amp;amp; Z und nur für gewerbliche Kunden in Süddeutschland. Klingt doch einfach? Ist es auch, wobei irgendwann wird die Arbeit mit Cubes ein wenig tricky, aber für den Moment reicht uns das an Hintergrund. Das Schöne an Cubes ist es, dass sie solche und ähnliche Abfragen quasi in Gedankengeschwindigkeit verarbeiten und beantworten. &lt;/p&gt;  &lt;p&gt;Eine Datenbank in Analysis Services ist in der Lage sich mittels einer ganzen Reihe von sogenannten Metadaten ausführlich selbst zu beschreiben. Wir haben u.a. folgende Metadaten im Zugriff:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Cubes &lt;/li&gt;    &lt;li&gt;Dimensionen &lt;/li&gt;    &lt;li&gt;Hierarchien &lt;/li&gt;    &lt;li&gt;Level &lt;/li&gt;    &lt;li&gt;Measures &lt;/li&gt;    &lt;li&gt;KPIs&lt;/li&gt;    &lt;li&gt;Named Sets &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Macht es eigentlich Sinn, dass unsere Clients sich immer wieder alle Metadaten ziehen müssen? Auch dazu habe ich mich ja schon öfters geäußert. Aus der Erfahrung heraus ist dafür der Einsatz einer BI Middleware sinnvoll, welche u. a. ein Repository bereitstellt, welches alle Entitäten aller in der BI Umgebung verfügbaren Objekte bereitstellt. Dazu gehören neben der Datenbewirtschaftung (SSIS Pakete) und Reports (RDL Dateien) auch Informationen über unsere Cubes.&lt;/p&gt;  &lt;p&gt;Häufig höre ich bei Vorträgen oder auch bei Coachings, dass es doch sicherlich viel zu aufwändig sei so einen Cube mit einzubinden. Da ist es doch einfacher zu versuchen mit den bisherigen Techniken voran zu kommen. Nun ja, was der Bauer nicht kennt, dass frisst er nicht. &lt;/p&gt;  &lt;p&gt;Und bevor wir zu sehr in die Details einsteigen, hier ein erstes Codebeispiel für das Herstellen einer Verbindung mit einem Cube:&lt;/p&gt;  &lt;p align="left"&gt;&lt;em&gt;&lt;strong&gt;using Microsoft.AnalysisServices.AdomdClient;        &lt;br /&gt;&lt;/strong&gt;&lt;/em&gt;&lt;em&gt;&lt;strong&gt;…        &lt;br /&gt;&lt;/strong&gt;&lt;/em&gt;&lt;em&gt;&lt;strong&gt;AdomdConnection mdcon = new AdomdConnection(&amp;lt;constring&amp;gt;);        &lt;br /&gt;&lt;/strong&gt;&lt;/em&gt;&lt;em&gt;&lt;strong&gt;mdcon.open();&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="left"&gt;&lt;em&gt;&lt;strong&gt;Wir machen was hoffentlich Sinnvolles…&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="left"&gt;&lt;em&gt;&lt;strong&gt;mdcon.close();&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align="left"&gt;Ok, das sieht doch schon mal ganz schlank aus. Kommen wir kurz zum Connectionstring.&lt;/p&gt;  &lt;p align="left"&gt;Eine ganz einfache Variante ist die folgende: “datasource=localhost;catalog=adventure works dw 2008”. Ideal für Demo- und Testzwecke. Dummerweise reicht das nicht im echten Leben und es gibt fast schon unverschämt viele Parameter mit denen die Verbindung konfiguriert werden kann. Für den Moment soll das aber reichen. Unser Connectionstring zeigt auf den Server “localhost” und die Datenbank “Adventure Works DW 2008”. Und immer daran denken, eine Datenbank in SSAS kann mehrere Cubes umfassen!&lt;/p&gt;  &lt;p align="left"&gt;So, ein weiterer Punkt ist der Namespace “Microsoft.AnalysisServices.AdomdClient” den wir hier verwenden. Damit wir ADOMD.NET überhaupt nutzen können, müssen wir zuerst im Visual Studio einen Verweis auf die “C:\Program Files\Microsoft.NET\ADOMD.NET\100\Microsoft.AnalysisServices.AdomdClient.dll” anlegen! Ab dann klappt das auch mit dem Namespace.&lt;/p&gt;  &lt;p align="left"&gt;Und was können wir nun mit so einem AdomdConnection Objekt anfangen? Eine ganze Menge! Zunächst fragen wir einfach mal die Umgebung ab, damit wir wissen was uns da eigentlich so geboten wird. Also hier ein wenig mehr Code:&lt;/p&gt;  &lt;p align="left"&gt;&lt;strong&gt;&lt;em&gt;foreach (CubeDef cube in mdcon.Cubes)        &lt;br /&gt;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (cube.Name.StartsWith(&amp;quot;$&amp;quot;))         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; continue;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lbT1.Items.Add(cube.Name+ &amp;quot; (&amp;quot;+cube.LastProcessed.ToString()+&amp;quot;)&amp;quot;);&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (Dimension dim in cube.Dimensions)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lbT1.Items.Add(&amp;quot; -&amp;gt; &amp;quot;+dim.Name);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (Hierarchy hier in dim.Hierarchies)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lbT1.Items.Add(&amp;quot;&amp;#160;&amp;#160; -&amp;gt; &amp;quot; + hier.Name); &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ist eigentlich recht einfach. Wir nehmen “mdcon”, also die Connection, und lassen uns in der Auflistung “Cubes” alle, nun ja, Cubes zeigen. Wir bekommen ein Cube Objekt, welches wiederum Eigenschaften hat, wie zum Beispiel “Name” &amp;amp; “LastProcessed”. In dem kleinen Codebeispiel schreibe ich die Werte in eine Listbox “lbT1”, daher dieses “lbT1.Items.Add” usw. Nun ja, und genauso machen wir weiter. Jeder Cube hat eine Auflistung für die verwendeten Dimensionen und die wiederum für die Hierarchien usw. Das ist doch einfach, oder?&lt;/p&gt;  &lt;p&gt;Was können wir nun mit diesen Daten, welche die Cubes beschreiben, anfangen? Bereits eine ganze Menge! Hängt auch ein wenig von unserer Rolle im Unternehmen oder dem Projekt ab.&lt;/p&gt;  &lt;p&gt;Wir können die Metadaten als Basis für spätere Abfragen nehmen. Gute Idee! Merken wir uns mal.&lt;/p&gt;  &lt;p&gt;Wir können aber auch die Daten verwenden für den Aufbau einer Dokumentation. Wir lesen die Metadaten aus und schreiben sie relational weg. Vielleicht speichern wir auch die Daten gleich historisch ab, damit uns Änderungen auffallen bzw. wir diese dokumentiert haben. Darauf lassen sich super Reports bauen. Wozu? Kommt auf die Rolle von uns an. Wir können unsere eigene Arbeit dokumentieren und Veränderungen festhalten, also quasi unseren Arbeitsfortschritt. Aber genauso gut können wir die Arbeit anderer damit kontrollieren bzw. protokollieren wie sich über die Zeit hinweg ein Cube verändert. Das geht dann so in Richtung Projekt – und Qualitätsmanagement.&lt;/p&gt;  &lt;p&gt;Kommen wir nun zu der eigentlichen Abfrage von Daten.&lt;/p&gt;  &lt;p&gt;Einen Pferdefuss hat die Arbeit mit ADOMD.NET, denn Ihr müsst MDX für die Queries nutzen. Sofern Ihr bisher MDX aus dem Weg gegangen seit oder es einfach keinen Grund gab für Euch sich damit zu beschäftigen, nun ja, jetzt ist der Moment gekommen in dem MDX in Euer Leben tritt!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;AdomdConnection mdcon = new AdomdConnection(tbConString.Text);        &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;…        &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;mdcon.Open();        &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;AdomdCommand cmd = mdcon.CreateCommand();        &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;cmd.CommandText = strMDXQuery;        &lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;CellSet cs = cmd.ExecuteCellSet();&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;Wir machen was Nützliches mit dem CellSet…&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;mdcon.Close();&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Und schon haben wir unser Resultset als CellSet im Objekt “cs” vorliegen. Hier kommen so die wohl wichtigsten Zeilen mit denen Ihr ein CellSet zerlegen könnt. Mit den beiden folgenden Zeilen bekommt Ihr die Große des Resultsets zurück.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;int x = cs.Axes[0].Positions.Count; // Anzahl Spalten&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;int y = cs.Axes[1].Positions.Count; // Anzahl Zeilen&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So, nun wollen wir die Spalten- und Zeilenbeschriftungen auslesen. Für die Darstellung hat das CellSet die Eigenschaft “Caption” dabei und für Abfragen haben wir den UniqueName.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;cs.Axes[0].Positions[xi].Members[0].Caption;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;cs.Axes[0].Positions[xi].Members[0].UniqueName;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ach ja, der eigentliche Wert ist ja auch noch da. Also nichts wie ran.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Value = cs[xi,yi].Value.ToString();&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p align="left"&gt;Das Ganze hier und noch viel, viel mehr schauen wir uns übrigens während des &lt;a href="http://www.passcamp.de" target="_blank"&gt;zweiten PASS Camp 2010&lt;/a&gt; gemeinsam im Detail an.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-1715163374530572640?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1715163374530572640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1715163374530572640'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/erste-schritte-mit-adomdnet.html' title='Erste Schritte mit ADOMD.NET'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6604662738454559835</id><published>2010-07-14T11:29:00.001+02:00</published><updated>2010-07-14T11:30:23.737+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Einsteiger'/><title type='text'>Warum sollten Tabellenhinweise (table hints) vermieden werden?</title><content type='html'>&lt;p&gt;Immer wieder sehe ich bei der Analyse von Anwendungen, dass mit sogenannten Tabellenhinweisen (table hints) gearbeitet wird. Meist ist die Begründung, dass der “doofe” SQL Server einfach nicht verstanden hat, dass es doch extra einen nicht-gruppierten Index für die Abfrage gibt. Den hat der doch einfach ignoriert! Und von anderen Entwicklungsumgebungen sei man ja schließlich auch gewöhnt die Verwendung von Indizes explizit anzugeben. Wo ist also das Problem?&lt;/p&gt;  &lt;p&gt;Nun ja, das Problem ist, dass die Erfahrung gezeigt hat, dass wenn soweit alles in Ordnung ist, der SQL Server ziemlich genau weiß, was er da so macht bei der Aufbereitung von Abfragen. Und wenn er einen Index nicht nutzen möchte, dann hat er in der Regel einen verdammt guten Grund dafür. Dummerweise wird dieser nicht angeben.&lt;/p&gt;  &lt;p&gt;Der häufigste Grund dafür, dass der SQL Server einen Index nicht verwendet, ist die Vermeidung von unnötiger Arbeit. Der SQL Server kann nämlich auf Basis der sogenannten Statistiken ziemlich genau abschätzen wie viele Datensätze er berühren muss für die Verarbeitung einer Abfrage. Daher ist es extrem wichtig, dass die Statistiken aktuell sind! Also nicht einfach in den Optionen für eine Datenbank deaktivieren, wenn Ihr nicht noch zumindest einen entsprechenden Job dafür aufgesetzt habt! Ist wirklich wichtig! &lt;/p&gt;  &lt;p&gt;Was meine ich nun mit unnötiger Arbeit? Dazu ein einfaches Beispiel.&lt;/p&gt;  &lt;p&gt;Wir nehmen als Datenbank mal nicht AdventureWorks, sondern die neue &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=de&amp;amp;FamilyID=868662dc-187a-4a85-b611-b7df7dc909fc" target="_blank"&gt;Contoso BI&lt;/a&gt;. Da ist ein klein wenig mehr Futter drin. Die Tabelle FactOnlineSales bringt es zumindest auf 12.627.608 Datensätze. Das ist zwar noch nicht wirklich viel, aber für unser Beispiel reichst auf jeden Fall. Auf “&lt;a href="http://saschalorenz.blogspot.com/2010/07/wie-messe-ich-eigentlich-den-erfolg-der.html" target="_blank"&gt;statistics io on&lt;/a&gt;” bin ich schon mal kurz eingegangen. Damit sind die IO-Operationen gemeint und nicht die Statistiken in den Indizes!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;set statistics io on;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select SUM(SalesAmount)        &lt;br /&gt;from FactOnlineSales         &lt;br /&gt;where DateKey between '31.12.2007' and '01.01.2009';&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Als Wert für die “logische Lesevorgänge” bekomme ich 46648. Den gilt es zu nun minimieren. Die Tabelle hat zurzeit nur einen gruppierten Index. Der scheint zwar auch alles andere als optimal gewählt zu sein, aber das ein anderes Thema. Im Ausführungsplan sehen wir, dass ein “Clustered Index Scan” durchgeführt wird.&lt;/p&gt;  &lt;p&gt;Nun fügen wir einen nicht-gruppierten Index hinzu für DateKey. Das macht doch Sinn, schließlich suchen wir ja nach DateKey.&lt;/p&gt;  &lt;p&gt;Und nun? Wir führen die Query nochmal aus und bekommen wieder ein ähnliches Ergebnis. Im Ausführungsplan ist immer noch ein “Clustered Index Scan”. Hier ist nun der Moment, wo der eine oder andere schwach wird und dem SQL Server nun den Index aufzwingen will. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select SUM(SalesAmount)        &lt;br /&gt;from FactOnlineSales with (index(ix_datekey))&amp;#160; &lt;br /&gt;where DateKey between '31.12.2007' and '01.01.2009';&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So, jetzt aber! Im Ausführungsplan sehen wir nun endlich, dass der Index verwendet wird. Und was kommt raus? 11186313 logische Lesevorgänge!!! Ist mein SQL Server kaputt? :-)&lt;/p&gt;  &lt;p&gt;Natürlich nicht! Wir sehen jetzt nur, warum der SQL Server den Index bisher vermieden hat. Der Index war nämlich alles andere als optimal für diese Abfrage. Zwar nutzt der SQL Server nun den Index, aber der eigentliche Wert, der SalesAmount, steckt ja noch im gruppierten Index. Daher fliegt unsere Abfrage nun immer eine schöne Schleife zwischen nicht-gruppierten und gruppierten Index. Das kostet uns so richtig Leseoperationen und damit Zeit. Wir nennen sowas eine Schlüsselsuche (bookmark lookup).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TD2DX8UIx5I/AAAAAAAAAM0/8wqbedJbN4w/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/TD2DYTk3TGI/AAAAAAAAAM4/pKeXaF3qzmw/image_thumb%5B3%5D.png?imgmax=800" width="566" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Das Coole daran ist, dass hat der SQL Server aufgrund der Statistiken kommen sehen und daher entschieden, dass ein simpler Scan auf dem gruppierten Index am Ende günstiger wird. Daher mein Hinweis, dass der SQL Server schon ziemlich genau weiß, warum er einen Index mal nimmt und mal nicht. Ehrlich!&lt;/p&gt;  &lt;p&gt;Und unsere Query? Haben wir denn nun keine Chance diese mit einem Index zu unterstützen? Aber sicher doch!&lt;/p&gt;  &lt;p&gt;Wir nehmen wieder unseren nicht-gruppierten Index und fügen als &lt;a href="http://saschalorenz.blogspot.com/2010/07/indizes-haben-wir-doch-schon-langst.html" target="_blank"&gt;eingeschlossene Spalte&lt;/a&gt; den SalesAmount hinzu. Und los. Jetzt bekomme wir nur noch 10512 logische Lesevorgänge. Und ganz wichtig, im Ausführungsplan sehen wir nur noch einen Index Seek auf unserem nicht-gruppierten Index.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TD2DZEu2fII/AAAAAAAAAM8/MM78IxbmzhQ/s1600-h/image%5B11%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/TD2DaG3mCII/AAAAAAAAANA/brw0u914BfY/image_thumb%5B7%5D.png?imgmax=800" width="474" height="96" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt; Da der SQL Server nun alle notwenigen Spalten in unserem Index findet, gibt es keine Notwendigkeit mehr für den Ausflug in den gruppierten Index. Das ist bewusst eingesetzt Redundanz, wobei wir um die Pflege nicht kümmern müssen. Ach ja, und wir brauchten dafür natürlich keinen Tabellenhinweis!&lt;/p&gt;  &lt;p&gt;Indizes mit eingeschlossenen Spalten sind zwar äußerst nützlich, aber bitte übertreibt jetzt nicht die Verwendung! Die Pflege kostet im Hintergrund immer Zeit beim Schreiben. &lt;/p&gt;  &lt;p&gt;Und letzte Worte zu Tabellenhinweisen: Ja, es gibt ganz, ganz wenige Sonderfälle in denen die Verwendung Sinn macht. Aber glaubt mir, die sind wirklich selten!!!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6604662738454559835?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6604662738454559835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6604662738454559835'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/warum-sollten-tabellenhinweise-table.html' title='Warum sollten Tabellenhinweise (table hints) vermieden werden?'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1gJtalph07w/TD2DYTk3TGI/AAAAAAAAAM4/pKeXaF3qzmw/s72-c/image_thumb%5B3%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-8564829850221654571</id><published>2010-07-12T17:44:00.001+02:00</published><updated>2010-07-12T17:44:37.140+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Projektmanagement'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Reifegradmodelle im Projektmanagement</title><content type='html'>&lt;p&gt;Mich erreichte die Nachfrage, was ich denn mit Reifegradmodellen im Projektmanagement meinen würde. In einem Post hatte ich den Begriff kurz fallengelassen als Hinweis auf einen möglichen &lt;a href="http://saschalorenz.blogspot.com/2010/07/wie-messe-ich-eigentlich-den-erfolg-der.html" target="_blank"&gt;Projektverlauf im Rahmen eines Performance Tunings&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Oft beschreiben Reifegradmodelle themenbezogen die möglichen Entwicklungsschritte einer ganzen Organisation. Es gibt dabei Modelle für ganz unterschiedliche Herausforderungen: IT-Infrastruktur &amp;amp; Security, Business Intelligence, Projektmanagement usw. Dabei wird in der Regel als Orientierung festgelegt, wo die Organisation im Referenzmodell gerade steht, was die nächste Stufe ist und durch welche Merkmale diese zu erreichen wäre. Das Reifegradmodell fasst dabei durch sein “Modell” die einzelnen “Reifegrade” der notwendigen Prozesse innerhalb der Organisation zusammen.&lt;/p&gt;  &lt;p&gt;Es geht mir nun darum, wie große, unhandliche und komplexere Projekte “eingefangen” werden können und damit das Risiko eines Scheiterns bereits während der Planung minimiert werden kann.&lt;/p&gt;  &lt;p&gt;Im Rahmen von Projekten werden häufig eine ganze Reihe von Prozessen bzw. Funktionalitäten implementiert oder auch erweitert. Während der Planung von Projekten gilt es für diese Implementierungen bzw. Änderungen einen Entwurf zu erstellen, welcher beschreibt wann was wie umgesetzt wird. Die Praxis zeigt, dass dieser Vorgang häufig damit endet, dass der Planer vom Hundertsten ins Tausendste kommt. Dieser Umstand kommt häufig daher, dass nicht immer klar ist, wie weit eine Implementierung in dem jeweiligen Teilprojekt gehen soll bzw. muss! So entstehen oft große undhandliche Projekte, welche dann leider auch meist zum Scheitern verurteilt sind.&lt;/p&gt;  &lt;p&gt;Schauen wir uns mal ein plakatives Beispiel an. Es soll ein komplettes Data Warehouse erstellt werden. Dieses Vorhaben als ein einziges großes Projekt abzubilden ist nicht unüblich. Das Scheitern solcher Projekte leider auch nicht. &lt;/p&gt;  &lt;p&gt;Erfolgsversprechender ist es die für den Betrieb eines Data Warehouse notwendigen Prozesse in einem so genannten Implementierungsprojekt ans Laufen zu bringen. Das Projekt ist erfolgreich, wenn die Prozesse “leben” und funktionieren. Änderungen und Erweiterungen am DWH sind dann meist keine Projekte mehr, sondern fallen in die Kategorie Change Request. Damit befinden wir uns dann mitten im Change Management des Life-Cycle-Managements eines DWHs. &lt;/p&gt;  &lt;p&gt;Trotz alledem wird es bei größeren Erweiterungen oder gar neuen Funktionen wieder die Notwendigkeit von Projekten geben. Was für Erweiterungen können das sein? Dafür ist das Thema Daten Qualität ein schönes Beispiel. Wie weit wollen oder müssen wir im Implementierungsprojekt beim Thema Daten Qualität im Data Warehouse gehen? Wäre es nicht sinnvoll für den Prozess DQ eine Reihe von Reifegraden zu definieren, mit denen wir die Entwicklungsstände dieses Teilprozesses dokumentieren und planen können? &lt;/p&gt;  &lt;p&gt;Wenn wir bei dem Data Warehouse bleiben, dann gibt es zum Beispiel auch das Thema nachhaltige Protokollierung des Zugriffs auf Daten (kurz Audit). Ist in vielen Umgebungen ein sehr wichtiges Thema, nur wie weit soll bereits im Implementierungsprojekt dieser Prozess vollständig abgebildet werden? Wieder kann hier eine Reihe von Reifegraden die Planung vereinfachen, da diese die künftige Entwicklungsschritte der Funktionalität vorbereiten und klar voneinander abgrenzen.&lt;/p&gt;  &lt;p&gt;Fassen wir nun die vorgesehenen Reifegrade der geplanten Prozesse und Funktionalitäten zusammen, so erhalten wir ein Referenzmodell für die angestrebte “komplette” Lösung, welche wir schrittweise erreichen können. Die Reifegrade sind damit auch die Grundlage für die Planung der Teilprojekte, welche wieder ganz klassisch im Projektmanagement stattfinden kann. Hier kommen sich unser Reifegradmodell und er Begriff Strategie sehr nahe.&lt;/p&gt;  &lt;p&gt;Unterstützt kann diese Vorgehensweise dadurch werden, dass wir für unsere diversen technischen Objekte in unserer Lösung ein Repository nutzen und in diesem u. a. den jeweiligen Entwicklungsstand festhalten und auch gleich die weitere Planung daran binden. Wichtig ist mir hier die Abgrenzung zur klassischen separaten Dokumentation. Diese hat zwar ihre Daseinsberechtigung, aber hat in der Regel keine direkte Bindung mit den Objekten in der Lösung. Objekte in einem solchen Repository können zum Beispiel SSIS Pakete, DQ Regeln, Inhalte von Reports (RDL), Dimensionen und Fakten eines Cubes und / oder eines Data Warehouses sein. &lt;/p&gt;  &lt;p&gt;Die Kombination aus einem Reifegradmodell für die angestrebte Lösung und Repository ist eine wertvolle Unterstützung für das Projektmanagement, da es sowohl die Planung als auch die Kommunikation im Teilprojekt vereinfacht. Dieses Vorgehensmodell lässt sich leicht auf andere komplexere IT-Projekte ausdehnen. SharePoint Projekte sind zum Beispiel ebenso prädestiniert für diese Vorgehensweise.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-8564829850221654571?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8564829850221654571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8564829850221654571'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/reifegradmodelle-im-projektmanagement.html' title='Reifegradmodelle im Projektmanagement'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-4500398696949042336</id><published>2010-07-08T19:23:00.001+02:00</published><updated>2010-07-08T19:23:21.201+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Einsteiger'/><title type='text'>Size matters! Woher bekomme ich größere Testdatenbanken?</title><content type='html'>&lt;p&gt;Häufig bekomme ich zu hören, dass die Adventure Works Datenbank ja zu klein sei, um mal wirklich Performance Tuning Szenarios im stillen Kämmerlein zu testen.&lt;/p&gt;  &lt;p&gt;Ok, zuerst natürlich die Anmerkung, dass wohl die wenigsten in besagtem Kämmerlein auch eine entsprechende Hardware haben, um “echte” Erlebnisse zu haben und damit Erfahrung zu sammeln. Sowas bekommt Ihr nur im Feld!&lt;/p&gt;  &lt;p&gt;Aber gut, ich gebe gern zu, dass die Adventure Works Umgebung tatsächlich ein wenig schlank ist. Daher hier ein paar Tipps wie Ihr an wesentlich mehr Daten kommen könnt!&lt;/p&gt;  &lt;p&gt;Erst mal die Frage an den Hersteller Microsoft, was dieser uns so bietet? Und siehe da, es gibt eine wesentlich größere Datenbank:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=de&amp;amp;FamilyID=868662dc-187a-4a85-b611-b7df7dc909fc" target="_blank"&gt;Microsoft Contoso BI-Demodatensatz für die Einzelhandelsbranche&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Woher kommen die denn nun? Das ist u. a. das Futter für PowerPivot Demos! :-)&lt;/p&gt;  &lt;p&gt;Hey, wer sagt da jetzt, dass ihm der Download zu groß ist? Ihr wolltet doch mehr…&lt;/p&gt;  &lt;p&gt;Ach so, es sollen mehr Datensätze aus dem Nix entstehen und zwar genau jetzt! Auch da kann geholfen werden. Es gibt zwar diverse Skripte dafür im Netz, aber die haben wir natürlich nie dann zur Hand, wenn wir diese brauchen. Müssen wir also kurz lernen, wie wir das quasi aus dem Kopf immer wieder schaffen werden.&lt;/p&gt;  &lt;p&gt;Es gibt zwar Ansätze mit Schleifen und einzelnen Inserts. Wir wollen das aber mal in einer Query versuchen. Vielleicht wird es auch noch eine Sub-Query.&lt;/p&gt;  &lt;p&gt;Rettung naht in Form der &lt;strong&gt;&lt;em&gt;master.sys.columns. &lt;/em&gt;&lt;/strong&gt;Wie das jetzt? Nun ja, die ist hoffentlich immer da und hat einige Zeilen. Daher merken:&lt;/p&gt;  &lt;h2 align="center"&gt;master.sys.columns&lt;/h2&gt;  &lt;p&gt;Und? Folgende Query wirft doch gerade mal 659 Zeilen bei mir und da ist auch gar nix nützliches drin!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select COUNT(*)        &lt;br /&gt;from master.sys.columns a;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Natürlich sind das jetzt noch zu wenig Zeilen, aber jetzt kommt der zweite Teil zum merken:&lt;/p&gt;  &lt;h2 align="center"&gt;cross join&lt;/h2&gt;  &lt;p align="left"&gt;Was? Wozu sollen das denn jetzt taugen? Ok, schaut Euch die folgende Query an:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select COUNT(*) as Anzahl       &lt;br /&gt;from master.sys.columns a        &lt;br /&gt;cross join master.sys.columns b&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Das macht schon mal 434.281 Zeilen bei mir. Und die hier?&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select COUNT(*) as Anzahl       &lt;br /&gt;from master.sys.columns a        &lt;br /&gt;cross join master.sys.columns b        &lt;br /&gt;cross join master.sys.columns c&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Wow, da kommen nun 286.191.179 Zeilen bei rum. Nur was haben wir damit gewonnen? Den &lt;strong&gt;Zähler&lt;/strong&gt; an den wir unsere Testdaten anhängen können! Nun brauchen wir nur noch kurz eine laufende Nummer. Moment mal, es gibt doch zum Beispiel ROW_NUMBER(). Aber die ist ja vorgesehen für die Over Klausel, aber das lässt sich relativ leicht “aushebeln”. Und mit dem TOP lässt dich die Anzahl genau steuern.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select top 500000       &lt;br /&gt;ROW_NUMBER() over( order by a.is_filestream&amp;#160; ) as nummer        &lt;br /&gt;from master.sys.columns a        &lt;br /&gt;cross join master.sys.columns b        &lt;br /&gt;cross join master.sys.columns c&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;h2&gt;&amp;#160;&lt;/h2&gt;  &lt;h2 align="center"&gt;ROW_NUMBER() over( order by a.is_filestream&amp;#160; ) as nummer&lt;/h2&gt;  &lt;p&gt;Hey, jetzt nicht schlapp machen beim merken! Ok? Führen wir mal alles zusammen. Mit der folgenden Query haben wir schon 50.000.000 Zeilen. Mit den Spalten Produkt, Lieferant und Umsatz könnt Ihr wenig spielen.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select        &lt;br /&gt;nummer,         &lt;br /&gt;N'Produkt'+ CAST( nummer % 100 as nvarchar(15)) as Produkt,        &lt;br /&gt;N'Lieferant' + CAST (nummer % 10 as nvarchar(15)) as Lieferant,        &lt;br /&gt;CAST(5000+ (nummer % 5000) as money) as Umsatz        &lt;br /&gt;into t9        &lt;br /&gt;from        &lt;br /&gt;(        &lt;br /&gt;&amp;#160; select top 50000000        &lt;br /&gt;&amp;#160; ROW_NUMBER() over( order by a.is_filestream&amp;#160; ) as nummer        &lt;br /&gt;&amp;#160; from master.sys.columns a        &lt;br /&gt;&amp;#160; cross join master.sys.columns b        &lt;br /&gt;&amp;#160; cross join master.sys.columns c        &lt;br /&gt;) x&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So, ich hoffe, dass nun der eine oder andere was für sich mitnehmen konnte bzw. nun eine Idee hat, wie aus dem Nix Testdaten entstehen können. Und nun viel Spaß beim Indizieren und passt mir bitte auf, dass Ihr nun &lt;strong&gt;nicht&lt;/strong&gt; produktive Server mit Testdaten &lt;strong&gt;flutet&lt;/strong&gt;!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-4500398696949042336?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4500398696949042336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/4500398696949042336'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/size-matters-woher-bekomme-ich-groere.html' title='Size matters! Woher bekomme ich größere Testdatenbanken?'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-8184907644294549572</id><published>2010-07-07T19:35:00.001+02:00</published><updated>2010-07-07T19:35:59.460+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Einsteiger'/><title type='text'>Indizes? Haben wir doch schon längst! Lassen Sie uns nun bitte zu den echten Tuning Methoden kommen.</title><content type='html'>&lt;p&gt;Das ist häufig eine spontane Antwort, welche ich auf den Vorschlag bekomme eine Anwendung mittel Indizes zu optimieren, wenn so das Gröbste aus dem Weg ist.&lt;/p&gt;  &lt;p&gt;Sowohl Entwickler als auch Administratoren scheint durchaus bewusst zu sein, dass Indizes und das Laufzeitverhalten einer Datenbank durchaus zusammenhängen (können). Aber ihnen scheint oft nicht die mögliche Tiefe des Themas bewusst zu sein, denn sie suchen häufig den wahren heiligen Gral der Performance Optimierung. Indizes haben sie schon, also muss es da draußen noch etwas anderes geben. Ist doch logisch, oder? :-)&lt;/p&gt;  &lt;p&gt;Mit diesem Post möchte ich den Leser, welcher sich angesprochen fühlt, dafür sensibilisieren, dass Indizierung viel mehr zu bieten hat, als er sich für den Moment vielleichtnvorstellen kann.&lt;/p&gt;  &lt;p&gt;Es hat sicherlich auch etwas damit zu tun, welche Rolle Indizes früher gespielt haben. Unter dbase III+ waren Indizes zum Beispiel eigentlich nichts anderes als nur zusätzliche Sortierreihenfolgen, welche auch für eine schnellere Suche genutzt werden konnten. Wer kann sich noch an FIND und SEEK erinnern? :-)&lt;/p&gt;  &lt;p&gt;In einem modernen relationalem Datenbank System wie dem SQL Server schaust ein wenig anders aus. Daten liegen meist bereits in Form eines B-Trees vors. Was ist ein B-Tree? –&amp;gt; &lt;a title="http://de.wikipedia.org/wiki/B-Baum" href="http://de.wikipedia.org/wiki/B-Baum"&gt;http://de.wikipedia.org/wiki/B-Baum&lt;/a&gt;. Und ja, es gibt wohl tatsächlich Fälle, in denen ein sogenannter Stapel (Heap) Sinn machen würde. Sind aber recht selten und legen wir gedanklich mal zur Seite.&lt;/p&gt;  &lt;p&gt;Es gibt pro Tabelle daher einen gruppierten (clustered index, CI), der entspricht auch gleichzeitigt DEN DATEN, und meist eine ganze Reihe von nicht gruppierten Indizes (non-clustered index, NCI). Damit scheint das Thema bereits durch zu sein. Es werden die Spalten mit einem Index hinterlegt, nach denen später “gesucht” werden soll. Damit ist meist die Verwendung mittels WHERE gemeint. Alles Mögliche wurde getan. Dabei fängt der Spaß doch jetzt erst richtig an!&lt;/p&gt;  &lt;p&gt;Ein Index ist nicht nur ein Weg um Daten schneller zu finden, häufig ist der Index gleichzusetzen mit den Daten. Nun ja, oder zumindest einem Teil der Daten. Am Besten den Teil der Daten, den ich gerade benötige. Ich hatte ja in &lt;a href="http://saschalorenz.blogspot.com/2010/07/wie-messe-ich-eigentlich-den-erfolg-der.html" target="_blank"&gt;einem Post&lt;/a&gt; darauf hingewiesen, dass die Vermeidung von IO Operationen das Ziel sein sollte. Mir bringen die schönsten Indizes nichts, wenn sich der SQL Server durch Unmengen Datenbankseiten wühlen muss.&lt;/p&gt;  &lt;p&gt;Worauf kann geachtet werden? Und, nein, ich möchte hier keine Kurzanleitung für die effektive Indizierung liefern, sondern nur mal kurz anreißen wie weit das Thema gehen kann. by the way, viel Sinnvolles über Indizierung steht in der SQL Server Hilfe (BooksOnline)!&lt;/p&gt;  &lt;p&gt;Fangen wir mal mit was Einfachem an. Die Wahl des richtigen Clustered Index Keys ist bereits entscheidend. Viele schauen dann auf und fragen: Welche Wahl? Ist das nicht immer der Primäre Schlüssel? Ja, per default ist er das meist, aber das muss nicht so sein und macht auch oft keinen Sinn! Denn die Reihenfolge in welcher meine Daten vorliegen ist gerade bei sogenannten Bereichsabfragen von Vorteil, aber wer fragt schon ständig von Kundennummer 4711 bis 5289 ab? Eher kommt wohl sowas vor wie “Alle Kunden in Köln” oder “Alle Umsätze in 2009”. Also ist hier die erste Chance zum Mitmachen.&lt;/p&gt;  &lt;p&gt;Kommen wir mal zu den nicht-gruppierten Indizes. Das ist doch “nur” ein Verweis auf die Daten im gruppierten Index, oder? Ja, aber das muss nicht so sein! Weil wenn der SQL Server im NCI alles findet, was er für die Beantwortung einer Abfrage benötigt, dann ist der so clever und lässt den CI doch tatsächlich links liegen und bedient sich aus dem NCI. Nun kommt natürlich sofort die Frage: “Aber was soll eine Abfrage in der nur Ort vorkommt, weil mehr steht doch nicht im Index?!? Ich brauche doch auch noch den Umsatz!” Und da fängt der Zauber an, denn es hält uns nichts davon ab, dass wir den Umsatz einfach mit in den Index legen. Ab SQL Server 2005 gibt es für sogenannte abdeckende Indizes sogar ein extra GUI Erlebnis (Eingeschlossene Spalten). Wir erzeugen bewusst Redundanz. Das ist immer ein Moment, da zeigt sich, ob der Berater den starrenden Augen des Kunden gewachsen ist. “Was, bewusst Redundanz herbeiführen? So ein Blödsinn! Und wie wird das gepflegt?” Das Schöne ist, dass sich das selbst pflegt. Ok, die Pflege kostet extra Zeit beim Schreiben, aber wenn der lesende Zugriff unterstützt werden soll, dann macht sowas durchaus Sinn. Die meisten Anwendungen sind eh viel mehr am Lesen als am Schreiben. Passt schon, aber besser vorher mal prüfen und nicht übertreiben.&lt;/p&gt;  &lt;p&gt;Die Reihenfolge der Spalten in einem Index spielt auch noch eine entscheidende Rolle! Hier kommt das Thema Selektivität zum tragen.&lt;/p&gt;  &lt;p&gt;Dann kann doch tatsächlich ein View wiederum in Form eines gruppierten Index persistiert werden. Damit lässt sich häufig auch eine Menge machen. Und natürlich lassen sich auf diesem CI auch wieder NCIs anlegen.&lt;/p&gt;  &lt;p&gt;NCI können gefiltert werden, es&amp;#160; wird nur ein Teil der Zeilen im CI vorgehalten. Spart wiederum Zeit bei der Pflege und Platz!&lt;/p&gt;  &lt;p&gt;Und pro Partition können auch wieder unterschiedliche Indizes verwendet werden. Viele Indizes nur für die aktuellen Daten und für das historische Zeug nur das nötigste.&lt;/p&gt;  &lt;p&gt;Um wem das noch nicht reicht, dem der Hinweis, dass selbst die Wahl auf welchen Festplatten welche Indizes liegen, oft zur Performance des Systems beitragen kann.&lt;/p&gt;  &lt;p&gt;Und so weiter… wir wollten das ja auch nur mal kurz anreißen!&lt;/p&gt;  &lt;p&gt;Das Thema Performance Tuning kann äußerst tief in die Interna des SQL Servers gehen. Häufig kommt die Frage nach dem “richtigen” Tuning. Die ist man mal meist gar nicht so einfach zu beantworten. Wie viel Tuning darf es denn sein? Am Anfang eines Performance Tuning Projektes kann meist mit einfachen Mitteln eine ganze Menge Performance rausgeholt werden. Dann geht es in die Detailanalyse, um den vielen kleinen aber lästigen Abfragen auf die Spur zu kommen. Pflicht ist dann noch ein Blick auf die Auswirkungen von parallelen Transaktionen, damit kann der Berater auch noch viel Spaß haben.&lt;/p&gt;  &lt;p&gt;Performance Tuning ist immer ein laufender Prozess, kein einmaliges Projekt! Um trotzdem allen Maßnahmen, Möglichkeiten und Abhängigkeiten Herr zu werden empfehle ich die Verwendung eines Reifegradmodells, in welchem festgelegt wird wie viel Zeit für welches Thema wann aufgebracht werden soll. Sonst kann das Ganze leider ziemlich schnell ins Endlose ausufern und keine messbaren Erfolge bringen. &lt;/p&gt;  &lt;p&gt;Der Lernprozess beim Performance Tuning ist wohl nie vorbei, da es immer noch eine tiefere Ebene gibt im SQL Server. Damit man aber mit seinem SQL Server überhaupt vom Fleck kommt, sollte ganz ordentlich beim Fundament angefangen werden und dann darf es nach und nach komplizierter werden. Viel es sein muss, nun ja, da empfehle ich von Koch “Die 80/20 Regel” Basiswerk zu.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-8184907644294549572?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8184907644294549572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/8184907644294549572'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/indizes-haben-wir-doch-schon-langst.html' title='Indizes? Haben wir doch schon längst! Lassen Sie uns nun bitte zu den echten Tuning Methoden kommen.'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-944621865659387922</id><published>2010-07-06T20:30:00.001+02:00</published><updated>2010-07-06T20:30:31.883+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Einsteiger'/><title type='text'>GROUP BY mit ROLLUP</title><content type='html'>&lt;p&gt;Anbei ein Thema, welches mir neulich erst wieder aufs Flipchart kam. Wie errechne ich in einem gruppierten Resultset möglichst einfach Zwischensummen?&lt;/p&gt;  &lt;p&gt;Nun ja, da sieht der Berater draußen schon recht spannende Konzepte in denen diverse UNION ALL eine entscheidende Rolle spielen! Dabei gibt es dafür in der Abfragesprache SQL extra ein Argument für diese Herausforderung.&lt;/p&gt;  &lt;p&gt;Kurze Anmerkung dazu, wenn Ihr zum Beispiel mit den Reporting Services unterwegs seit, dann habt Ihr diese Fragestellung sehr wahrscheinlich gar nicht, da dort Zwischensummen durch die Gruppierungsfunktion im Report abgebildet wird. So, der Rest von uns kann nun weiterlesen. &lt;/p&gt;  &lt;p&gt;Ach ja, und das betrifft jetzt nicht nur den SQL Server, wir bewegen uns da durchaus im ANSI Standard! :-)&lt;/p&gt;  &lt;p&gt;Wir nehmen unsere gute alte AdventureWorksDW2008. Als Beispiel wollen wir uns den Umsatz aus der FactInternetSales aufgeteilt nach Attributen aus der Dimension Product darstellen lassen. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select EnglishProductCategoryName, EnglishProductSubcategoryName, EnglishProductName, SalesAmount        &lt;br /&gt;from FactInternetSales fis         &lt;br /&gt;left join DimProduct dp on fis.ProductKey = dp.ProductKey         &lt;br /&gt;left join DimProductSubcategory dps on dps.ProductSubcategoryKey = dp.ProductSubcategoryKey         &lt;br /&gt;left join DimProductCategory dpc on dpc.ProductCategoryKey = dps.ProductCategoryKey&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;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://lh6.ggpht.com/_1gJtalph07w/TDN2Ddepm8I/AAAAAAAAAMQ/kWzy4GVksdQ/image%5B6%5D.png?imgmax=800" width="526" height="156" /&gt; &lt;/p&gt;  &lt;p&gt;Ok, so im Detail muss es ja man mal gar nicht sein, also bilden wir Gruppen mittels GROUP BY.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select EnglishProductCategoryName, EnglishProductSubcategoryName, EnglishProductName, sum(SalesAmount) as Umsatz, COUNT(*) as Anzahl        &lt;br /&gt;from FactInternetSales fis         &lt;br /&gt;left join DimProduct dp on fis.ProductKey = dp.ProductKey         &lt;br /&gt;left join DimProductSubcategory dps on dps.ProductSubcategoryKey = dp.ProductSubcategoryKey         &lt;br /&gt;left join DimProductCategory dpc on dpc.ProductCategoryKey = dps.ProductCategoryKey         &lt;br /&gt;group by EnglishProductCategoryName, EnglishProductSubcategoryName, EnglishProductName         &lt;br /&gt;order by EnglishProductCategoryName, EnglishProductSubcategoryName, EnglishProductName&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TDN2EKohWaI/AAAAAAAAAMU/pSgMrYVrtAE/s1600-h/image%5B13%5D.png"&gt;&lt;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://lh6.ggpht.com/_1gJtalph07w/TDN2FiSwd-I/AAAAAAAAAMY/BaIWvSQ2qQA/image_thumb%5B7%5D.png?imgmax=800" width="539" height="151" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Besser! Aber jetzt fragt doch tatsächlich jemand nach Zwischensummen für Category und Subcategory! Wie bringen wir die nun in das Resultset? Dafür gibt es die GROUP BY Erweiterung ROLLUP!&lt;/p&gt;  &lt;p&gt;Und hier jetzt ein Beispiel mit GROUP BY ROLLUP.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select EnglishProductCategoryName, EnglishProductSubcategoryName, EnglishProductName, sum(SalesAmount) as Umsatz, COUNT(*) as Anzahl        &lt;br /&gt;from FactInternetSales fis         &lt;br /&gt;left join DimProduct dp on fis.ProductKey = dp.ProductKey         &lt;br /&gt;left join DimProductSubcategory dps on dps.ProductSubcategoryKey = dp.ProductSubcategoryKey         &lt;br /&gt;left join DimProductCategory dpc on dpc.ProductCategoryKey = dps.ProductCategoryKey         &lt;br /&gt;group by rollup( EnglishProductCategoryName , EnglishProductSubcategoryName, EnglishProductName)         &lt;br /&gt;order by EnglishProductCategoryName, EnglishProductSubcategoryName, EnglishProductName&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/TDN2IjuUdwI/AAAAAAAAAMc/PpseqHgEht0/s1600-h/image%5B18%5D.png"&gt;&lt;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://lh6.ggpht.com/_1gJtalph07w/TDN2K3qPQ8I/AAAAAAAAAMg/LKCBtecceBM/image_thumb%5B10%5D.png?imgmax=800" width="531" height="278" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Was ist passiert? Wir sehen in der ersten Zeile nun die Umsätze gesamt über alle drei Attribute. Das ist noch keine Kunst, dafür hätten wir kein GROUP BY benötigt, dass hätte auch ein einfaches SUM geschafft. Aber nun bekommen wir auch die Summen je Subcategory und Category dargestellt. Das NULL zeigt jeweils an, dass es sich um eine Summenzeile für das jeweilige Attribut handelt.&lt;/p&gt;  &lt;p&gt;Und wer jetzt sagt, dass er das schon alles kennt aber eine andere Syntax dafür verwendet. Der sei gewarnt! Denn die Notation mit “with rollup” ist nicht ANSI-konform und läuft daher aus! Fällt Euch also vielleicht bei einem späteren Update auf die Füße!&lt;/p&gt;  &lt;p&gt;Wer sich nun noch an den NULLs stört und diese nicht in seiner Anwendung nutzen möchte, der kann diese natürlich auch direkt in der Abfrage in was Sprechendes ändern .&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select        &lt;br /&gt;isnull(EnglishProductCategoryName,'Summe') as Produktkategorie,         &lt;br /&gt;isnull(EnglishProductSubcategoryName, 'Summe') as Produktunterkategorie,         &lt;br /&gt;isnull(EnglishProductName,'Summe') as Produkt,         &lt;br /&gt;sum(SalesAmount) as Umsatz, COUNT(*) as Anzahl         &lt;br /&gt;from FactInternetSales fis         &lt;br /&gt;left join DimProduct dp on fis.ProductKey = dp.ProductKey         &lt;br /&gt;left join DimProductSubcategory dps on dps.ProductSubcategoryKey = dp.ProductSubcategoryKey         &lt;br /&gt;left join DimProductCategory dpc on dpc.ProductCategoryKey = dps.ProductCategoryKey         &lt;br /&gt;group by&amp;#160; rollup( EnglishProductCategoryName , EnglishProductSubcategoryName, EnglishProductName)         &lt;br /&gt;order by EnglishProductCategoryName, EnglishProductSubcategoryName, EnglishProductName&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/TDN2Lo5fBwI/AAAAAAAAAMk/vG66FVj_lKI/s1600-h/image%5B24%5D.png"&gt;&lt;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://lh6.ggpht.com/_1gJtalph07w/TDN2OQk9jPI/AAAAAAAAAMo/--yCT8rpJbo/image_thumb%5B14%5D.png?imgmax=800" width="551" height="298" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Und noch was. Da AdventureWorksDW2008 ja die Basis des Microsoft Beispiel-Cubes für die Analysis Services ist, können wir die Ergebnisse unserer Query auch mittels Cube überprüfen bzw. den Cube mit unserer Query gegenprüfen. Hey, cool, geht auf! :-)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/TDN2PN-8SVI/AAAAAAAAAMs/BUX2MBrPqXs/s1600-h/image%5B29%5D.png"&gt;&lt;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://lh6.ggpht.com/_1gJtalph07w/TDN2RYjFbdI/AAAAAAAAAMw/u84QY07ePe8/image_thumb%5B17%5D.png?imgmax=800" width="353" height="371" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Für viele Anwendungsfälle wäre es sehr wahrscheinlich einfacher, wenn wir direkt aus unserer Applikation auf einen OLAP Cube zugreifen würden. Das wird aber noch seltener genutzt als die ROLLUP Erweiterung, dabei ist die Anwendung fast einfacher. Das bringt mich zu ADOMD.NET, aber das beschreibe ich ein anderes mal im Detail. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-944621865659387922?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/944621865659387922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/944621865659387922'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/group-by-mit-rollup.html' title='GROUP BY mit ROLLUP'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1gJtalph07w/TDN2Ddepm8I/AAAAAAAAAMQ/kWzy4GVksdQ/s72-c/image%5B6%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6739371954649717868</id><published>2010-07-05T22:38:00.001+02:00</published><updated>2010-07-05T22:38:02.437+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Einsteiger'/><title type='text'>Wie messe ich eigentlich den Erfolg der Optimierung einer SQL Abfrage?</title><content type='html'>&lt;p&gt;Hier ein Thema, welches mir immer wieder in Coachings von Einsteigern und Juniorberatern begegnet. Daher speziell für diese Zielgruppe ein paar Grundlagen.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;Wie messe ich eigentlich, ob dank einer Maßnahme eine Query “schneller” geworden ist?&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;Der eine oder andere mag denken, dass das doch eine überflüssige Frage ist. Die Optimierung war erfolgreich, wenn eine Abfrage schneller fertig ist. Wo ist also das Problem? Und schließlich hat doch das Management Studio in der rechten untern Ecke extra dafür einen Timer. Und im Profiler kann ich mir doch auch die Dauer einer Abfrage anschauen. Damit sollte das Thema doch eigentlich durch sein, oder? Und bei vielen Queries steht da unten doch eh nur 00:00:00, die können also doch gar nicht weh tun. &lt;/p&gt;  &lt;p&gt;Nun ja, ganz so einfach ist es dann doch nicht. Die Zeit, welche eine Query benötigt, ist immer relativ und kann von vielem abhängig sein. Die wesentlich entscheidendere Größe beim Tuning ist die Anzahl der für die Beantwortung notwendigen Datenbankseiten! Und dabei ist es fast egal, ob die Seiten gerade warm und trocken im Cache liegen oder gar erst vom Plattensystem gelesen werden müssen. Seite bleibt Seite. Daher sollte ein Ziel von Optimierungsmaßnahmen immer sein, dass die Anzahl der für ein Resultset notwendigen Datenbankseiten minimiert wird! Auch bei Abfragen, welche gefühlt flott laufen, kann es Sinn machen diese entsprechend zu optimieren, wenn diese auf einem Server vielleicht viele tausend Mal am Tag ausgeführt wird.&lt;/p&gt;  &lt;p&gt;Ok, nur wie kommen wir nun an diese Anzahl der notwendigen Seiten und wie reduzieren wir diese?&lt;/p&gt;  &lt;p&gt;Für den Einstieg in das Thema ist es nicht immer notwendig gleich den SQL Profiler mitlaufen zu lassen. Auch Querypläne müssen nicht immer gleich zerlegt werden, auch wenn das einen bereits deutlich nach vorne bringen würde. &lt;/p&gt;  &lt;p&gt;Mit folgender Anweisung schalten wir die Darstellung einer Statistik ein, welche uns die Anzahl der Datenbankenseiten pro verwendeter Tabelle zeigen wird:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;set statistics io on;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Und nun noch eine kleine Abfrage für die gute alte AdventureWorksDW2008:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;em&gt;select SUM(SalesAmount), COUNT(*)       &lt;br /&gt;from dbo.FactInternetSales fis        &lt;br /&gt;left join dbo.DimCustomer dc on dc.CustomerKey = fis.CustomerKey        &lt;br /&gt;where dc.YearlyIncome &amp;gt; 50000;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Und schon sehen wir im Management Studio unter Meldungen folgendes:&lt;/p&gt;  &lt;p&gt;(1 Zeile(n) betroffen)   &lt;br /&gt;Worktable-Tabelle. Scananzahl 0, logische Lesevorgänge 0, physische Lesevorgänge 0, Read-Ahead-Lesevorgänge 0, logische LOB-Lesevorgänge 0, physische LOB-Lesevorgänge 0, Read-Ahead-LOB-Lesevorgänge 0.    &lt;br /&gt;FactInternetSales-Tabelle. Scananzahl 1,&lt;strong&gt; logische Lesevorgänge 1030&lt;/strong&gt;, physische Lesevorgänge 0, Read-Ahead-Lesevorgänge 0, logische LOB-Lesevorgänge 0, physische LOB-Lesevorgänge 0, Read-Ahead-LOB-Lesevorgänge 0.    &lt;br /&gt;DimCustomer-Tabelle. Scananzahl 1, &lt;strong&gt;logische Lesevorgänge 978&lt;/strong&gt;, physische Lesevorgänge 0, Read-Ahead-Lesevorgänge 0, logische LOB-Lesevorgänge 0, physische LOB-Lesevorgänge 0, Read-Ahead-LOB-Lesevorgänge 0.&lt;/p&gt;  &lt;p&gt;Das “Ziel” habe ich mal markiert. Diese Werte gilt es im Rahmen einer Optimierung zu reduzieren. Denn je weniger Seiten benötigt werden, um so schneller wird die Abfrage und, kleiner Nebeneffekt, um so geringer sind Probleme durch Sperren. Performanceschwierigkeiten kann so viele Gründe haben, aber das würde hier zu weit gehen.&lt;/p&gt;  &lt;p&gt;Aber wie kommen wir nun zu einer Optimierung? Es gibt zwei grundsätzliche Wege:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;durchdachtere SQL Abfragen (weites Feld, würde den Rahmen dessen hier für den Moment sprengen)&lt;/li&gt;    &lt;li&gt;bessere Indizierung (wird von viel zu vielen unterschätzt und von einigen tatsächlich auch überschätzt)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Am Ende geht es um weniger Seiten oder wie der Profi sagt: Weniger IO Operationen.&lt;/p&gt;  &lt;p&gt;Wir versuchen es mal mit der Erzeugung von zwei Indizes, um die Lesevorgänge deutlich reduzieren. Für Details einfach mal einen Blick in die BooksOnline des SQL Server werfen.&lt;/p&gt;  &lt;p&gt;CREATE NONCLUSTERED INDEX [ix_DimCustomer_YearlyIncome] ON [dbo].[DimCustomer]    &lt;br /&gt;(    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [CustomerKey] ASC    &lt;br /&gt;)    &lt;br /&gt;INCLUDE ( [YearlyIncome]) ON [PRIMARY]&lt;/p&gt;  &lt;p&gt;CREATE NONCLUSTERED INDEX [ix_FactInternetSales_CustomerKey_SalesAmount] ON [dbo].[FactInternetSales]    &lt;br /&gt;(    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [CustomerKey] ASC    &lt;br /&gt;)    &lt;br /&gt;INCLUDE ( [SalesAmount]) ON [PRIMARY]&lt;/p&gt;  &lt;p&gt;So, identische Query nochmal starten und schon sehen wir, dass unsere Bemühungen erste Erfolge zeigen. Ach ja, natürlich bleibt das Ergebnis der SQL Abfrage identisch!&lt;/p&gt;  &lt;p&gt;(1 Zeile(n) betroffen)   &lt;br /&gt;FactInternetSales-Tabelle. Scananzahl 1,&lt;strong&gt; logische Lesevorgänge 257&lt;/strong&gt;, physische Lesevorgänge 0, Read-Ahead-Lesevorgänge 0, logische LOB-Lesevorgänge 0, physische LOB-Lesevorgänge 0, Read-Ahead-LOB-Lesevorgänge 0.    &lt;br /&gt;DimCustomer-Tabelle. Scananzahl 1, &lt;strong&gt;logische Lesevorgänge 44&lt;/strong&gt;, physische Lesevorgänge 0, Read-Ahead-Lesevorgänge 0, logische LOB-Lesevorgänge 0, physische LOB-Lesevorgänge 0, Read-Ahead-LOB-Lesevorgänge 0.&lt;/p&gt;  &lt;p&gt;Was passiert da? Kurzgefasst kann gesagt werden, dass der Queryoptimizer nun nur noch unsere beiden Indizes verwendet, welche genau die Spalten bereitstellen, die unsere Query benötigt. Und damit wäre normalerweise noch nicht Schluss mit der Optimierung, aber für den Moment soll das reichen, um das Konzept zu verdeutlichen wie wir den Erfolg einer Maßnahme messen können. Denn darum ging es mir hier.&lt;/p&gt;  &lt;p&gt;Also, nochmal wiederholt: &lt;strong&gt;&lt;em&gt;Erfolgreiche Optimierung heißt u. a. Reduzierung von Seitenzugriffen! &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Und messen könnt Ihr das u. a. mittels &lt;strong&gt;set statistics io on&lt;/strong&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6739371954649717868?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6739371954649717868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6739371954649717868'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/07/wie-messe-ich-eigentlich-den-erfolg-der.html' title='Wie messe ich eigentlich den Erfolg der Optimierung einer SQL Abfrage?'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-2670026087420664453</id><published>2010-06-30T13:31:00.001+02:00</published><updated>2010-06-30T13:31:30.025+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><title type='text'>PASS Camp 2010 R2 – Save the Date!</title><content type='html'>&lt;p&gt;Vielleicht habt Ihr es im PASS Newsletter ja schon gelesen. Es wird dieses Jahr ein weiteres &lt;a href="http://www.passcamp.de/" target="_blank"&gt;PASS Camp&lt;/a&gt; geben!&lt;/p&gt;  &lt;p&gt;Vom 19. – 21.10.2010 geht es im Gut Höhne in Mettmann wieder nur um das Thema SQL Server. &lt;/p&gt;  &lt;p&gt;Themen werden sein Self-Service BI, BI für Developer und BI für Admins.&lt;/p&gt;  &lt;p&gt;Nachdem ich beim ersten PASS Camp in diesem Jahr eine Late Night Session hatte, gibt es mich nun ganze 3 Tage lang zum Thema BI für Developer. Details dazu werden aber noch folgen. Wer meinen Blog hier in den letzten Jahren verfolgt hat, kann sich schon denken, was wir da gemeinsam machen werden. Gemeinsam? Genau, da bei den PASS Camps immer ein großer Wert auf viele Hands-On gelegt wird ist mitmachen gefordert. Also werdet Ihr mir nicht nur beim Codieren zusehen (wie öde…), sondern selbst Eure Ideen umsetzen dürfen!&lt;/p&gt;  &lt;p&gt;Ich freue mich schon drauf und hoffe viele Euch vor Ort zu treffen!&lt;/p&gt;  &lt;p&gt;ps: Und für den Fall, dass Ihr den PASS Newsletter gar nicht bekommen… dann schnell unter &lt;a href="http://www.sqlpass.de"&gt;www.sqlpass.de&lt;/a&gt; anmelden!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-2670026087420664453?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2670026087420664453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/2670026087420664453'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/06/pass-camp-2010-r2-save-date.html' title='PASS Camp 2010 R2 – Save the Date!'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-6793225326942125158</id><published>2010-06-07T12:07:00.001+02:00</published><updated>2010-06-07T12:07:28.240+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PowerPoint Tipps'/><title type='text'>Interaktive Referenzhandbücher für Office 2010!</title><content type='html'>&lt;p&gt;Der eine oder andere wird sich vielleicht noch an einen Post vom Juni 2007 erinnern, in welchem ich die &lt;a href="http://saschalorenz.blogspot.com/2007/07/interaktive-referenzhandbcher-fr-office.html" target="_blank"&gt;interaktiven Referenzhandbücher für Office 2007&lt;/a&gt; vorgestellt habe.&lt;/p&gt;  &lt;p&gt;Nun ist Zeit für Office 2010! Und schon gibt die &lt;a href="http://office2010.microsoft.com/de-de/excel-help/erkunden-von-menuband-und-backstage-in-2010-produkten-HA101794130.aspx" target="_blank"&gt;interaktiven Referenzhandbücher für 2010&lt;/a&gt;! Wie schon 2007 eine sehr gelungene Hilfe für Einsteiger in das aktuelle Office. Technologisch wird nun natürlich auf Silverlight gesetzt. Ein Vorteil ist, dass die Handbücher nun auch offline installiert werden. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-6793225326942125158?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6793225326942125158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/6793225326942125158'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/06/interaktive-referenzhandbucher-fur.html' title='Interaktive Referenzhandbücher für Office 2010!'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-5653820410740531407</id><published>2010-06-04T22:03:00.001+02:00</published><updated>2010-06-04T22:03:04.967+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><title type='text'>Klönschnack för Lüüd, de dat suur hebbt mit de SQL Server</title><content type='html'>&lt;p&gt;&lt;a href="http://www.sqlpass.de/Regionalgruppen/Hamburg/tabid/78/Default.aspx"&gt;Am nächsten Donnerstag, den 10. Juni 2010, findet das 50. Treffen der Regionalgruppe Hamburg des PASS Deutschland e.V. statt!&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Zum 50. Treffen halten wir einen „Tech-Talk“ zum Thema Troubleshooting ab. Jeder kann seine ganz persönliche Herausforderung mit dem SQL Server mitbringen und wir werden dann versuchen, gemeinsam einen Lösungsansatz dafür zu finden!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Unter allen Teilnehmern des Treffens verlosen wir eine NFR Vollversion von &lt;a href="http://www.microsoft.com/germany/expression/products/Web_Overview.aspx" target="_blank"&gt;Microsoft Expression Web 3&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-5653820410740531407?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5653820410740531407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5653820410740531407'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/06/klonschnack-for-luud-de-dat-suur-hebbt.html' title='Klönschnack för Lüüd, de dat suur hebbt mit de SQL Server'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-1318732341652116643</id><published>2010-06-03T12:29:00.001+02:00</published><updated>2010-06-03T12:29:44.559+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PASS Deutschland e.V.'/><category scheme='http://www.blogger.com/atom/ns#' term='Partner Technical Communities'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Zwei Community Abende in Böblingen und einer in Hamburg</title><content type='html'>&lt;p&gt;Nächste Woche ist mal wieder eine Community Woche! Es stehen ganze drei Community Events an. &lt;/p&gt;  &lt;p&gt;Dienstag und Mittwoch (8. und 9.6.2010) bin ich im Raum Stuttgart unterwegs und werde Abends in der Microsoft Niederlassung Böblingen jeweils einen kleinen Vortrag zum Thema SQL Server halten.&lt;/p&gt;  &lt;p&gt;Am Dienstag werde ich vor der Partner Technical Community Stuttgart (&lt;a title="https://www.xing.com/net/msptc/" href="https://www.xing.com/net/msptc/"&gt;https://www.xing.com/net/msptc/&lt;/a&gt;) sprechen. Thema ist die Vermittlung von Basis Wissen für den Administrator über den SQL Server mit (fast ganz) ohne Marketing. :-)&lt;/p&gt;  &lt;p&gt;Sofern Ihr die Partner Technical Communities noch nicht kennt, hier ein wenig Werbung für diese:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“Diese Gruppe ist eine Networking-Plattform für technische Mitarbeiter aus dem Microsoft Partner-Netzwerk. Ziel ist der Aufbau einer Community, die sich regelmäßig zu technischen Produktfragen austauscht und Neuentwicklungen kritisch &amp;amp; zielorientiert begleitet. Die Gruppe soll Basis für regionale Aktivitäten sein und vor allem Partner außerhalb der Ballungsgebiete eng einbinden. Wir bieten Know how Austausch und eine Diskussionsplattform - jedoch keinen technischen Support!“ (frech geklaut von der Beschreibung in Xing)&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Den Mittwoch geht es dann zu meiner Stamm-Community, dem PASS Deutschland e.V., zur Regionalgruppe Stuttgart (&lt;a title="http://www.sqlpass.de/Regionalgruppen/Stuttgart/tabid/87/Default.aspx" href="http://www.sqlpass.de/Regionalgruppen/Stuttgart/tabid/87/Default.aspx"&gt;http://www.sqlpass.de/Regionalgruppen/Stuttgart/tabid/87/Default.aspx&lt;/a&gt;). Dort werde ich über den Einsatz von ADOMD.net für den Zugriff auf Analysis Services Cube sprechen. Ich werde die notwendigen Grundlagen vermitteln (äh, nein, das wird kein MDX Crashkurs!) und auch ein paar Einsatzbeispiele zeigen.&lt;/p&gt;  &lt;p&gt;Dann wieder schnell zurück nach Hamburg, weil am Donnerstag Abend ist dort das &lt;strong&gt;50. Treffen der PASS Regionalgruppe Hamburg&lt;/strong&gt; (&lt;a title="http://www.sqlpass.de/Regionalgruppen/Hamburg/tabid/78/Default.aspx" href="http://www.sqlpass.de/Regionalgruppen/Hamburg/tabid/78/Default.aspx"&gt;http://www.sqlpass.de/Regionalgruppen/Hamburg/tabid/78/Default.aspx&lt;/a&gt;)!&lt;/p&gt;  &lt;p&gt;Das verspricht eine interessante Woche mit vielen neuen Gesichtern zu werden. Ich freue mich darauf! Vielleicht sehen wir uns ja bei einem der Events?!?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-1318732341652116643?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1318732341652116643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/1318732341652116643'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/06/zwei-community-abende-in-boblingen-und.html' title='Zwei Community Abende in Böblingen und einer in Hamburg'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-5650642520327888872</id><published>2010-05-09T08:50:00.001+02:00</published><updated>2010-05-09T08:50:21.571+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Cube Funktionen in Excel 2007 &amp; 2010</title><content type='html'>&lt;p&gt;In der letzten Woche kam während eines SSAS Workshops die Frage nach dem Sinn der Cube Funktion in Excel 2007 &amp;amp; 2010 auf. Zwar war den meisten Teilnehmern die Existenz der Funktionen bekannt, da sie diese über den Menüpunkt “In Formeln konvertieren” in Excel (s. Screenshot) kannten, aber bisher hatte kein Teilnehmer Erfolg dabei einen Bericht von Grund auf mit den Funktionen zu erstellen.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/S-XVkA50_5I/AAAAAAAAAIA/387Bh7M6ZGU/image%5B18%5D.png?imgmax=800" width="327" height="156" /&gt;&lt;/p&gt;  &lt;p&gt;Die offizielle Online Hilfe von Microsoft kennt zwar die Funktionen, aber die Beschreibung der Funktionsweise als auch die Beispiele dort sind eher knapp gehalten bzw. leider auch ein wenig substanzlos.&lt;/p&gt;  &lt;p&gt;Welche Funktionen für die Arbeit mit Analysis Services Cubes kennt ein Excel überhaupt? Das lässt sich leicht herausfinden. Einfach mal “=cube” in eine Zelle eingeben. Die AutoVervollständigen Funktion von Excel zeigt uns alle Excel Funktionen an.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XVlY6-fTI/AAAAAAAAAIE/F4C7_42JbMo/image%5B11%5D.png?imgmax=800" width="201" height="161" /&gt;&lt;/p&gt;  &lt;p&gt;Das sind ganze 7 Excel Funktionen. Fangen wir mit einem einfachen Beispiel für CUBEWERT an. Dazu geben wir in eine Zelle “=cubewert(” ein. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/S-XVmlIW69I/AAAAAAAAAII/2kp972C72QY/image%5B17%5D.png?imgmax=800" width="276" height="72" /&gt; &lt;/p&gt;  &lt;p&gt;Als ersten Parameter benötigen wir eine Verbindung. Nach der Eingabe eines Anführungszeichen bekommen wir eine Auswahl aller gespeicherten Verbindungen zu Analysis Services Würfeln.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-XVoLchitI/AAAAAAAAAIM/q_ASOrbkKFs/image%5B26%5D.png?imgmax=800" width="317" height="87" /&gt; &lt;/p&gt;  &lt;p&gt;Wie kommt aber Euer Excel nun an eine solche Verbindung? Wenn Ihr von einer leeren Arbeitsmappe aus startet, dann kennt diese noch keine Verbindungen. Verbindungen werden über den Tab “Daten” und den Punkt “Verbindungen” hinzugefügt.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/S-XVrsdhLSI/AAAAAAAAAIQ/YXNReZXWGUw/s1600-h/image%5B31%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-XVux6i9wI/AAAAAAAAAIU/mbNKeqPUKKA/image_thumb%5B9%5D.png?imgmax=800" width="636" height="325" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Und die vorhandenen Verbindungen entstehen, wenn Ihr Euch schon mal mit Würfeln verbunden habt. Dazu ist dieser Dialog im Datenverbindungs-Assistent. Der kommt Euch sicher bekannt vor.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/S-XVwQpTG5I/AAAAAAAAAIY/koseQi8UmHs/image%5B37%5D.png?imgmax=800" width="395" height="322" /&gt; &lt;/p&gt;  &lt;p&gt;Aber zurück zu unserem CUBEWERT Beispiel. Wir wählen nun eine Verbindung aus indem wir die “Tab”-Taste drücken und mit Anführungszeichen die Bezeichnung der Verbindung abschließen.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-XVxVmo5CI/AAAAAAAAAIc/Yj9Octs8Ly8/image%5B50%5D.png?imgmax=800" width="408" height="63" /&gt; &lt;/p&gt;  &lt;p&gt;Nun noch ein Semikolon und Excel erwartet den nächsten Parameter. Geben wir erst mal wieder Anführungszeichen ein.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XVyWsu3dI/AAAAAAAAAIg/XZkc68owqm4/image%5B57%5D.png?imgmax=800" width="468" height="199" /&gt; &lt;/p&gt;  &lt;p&gt;Was ist das? Das sind ja alle Dimensionen unseres Cubes! Wie hilfreich! Wählen wir erst mal “[Date]” aus. Einfach mit den Cursortasten markieren und wieder die “Tab”-Taste betätigen. Und nun? Einfach mal einen Punkt eingeben. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-XVzu93sHI/AAAAAAAAAIk/oj_m-qT9mnI/image%5B62%5D.png?imgmax=800" width="238" height="244" /&gt; &lt;/p&gt;  &lt;p&gt;Und schon sind wir auf dem nächsten Level der Hierarchie der Date Dimension. Dort wählen wir nun “[Date].[Calendar]” aus. Zum Abschluss geben wir noch “.&amp;amp;[2003]”)” ein, da uns das Jahr 2003 interessiert. Eine andere Art der Auswahl gibst gleich.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XV0aJeE7I/AAAAAAAAAIo/AttyjYbZwew/image%5B69%5D.png?imgmax=800" width="486" height="50" /&gt; &lt;/p&gt;  &lt;p&gt;Mit der Enter-Taste bestätigen wir die Eingabe der Formel. Bei mir erscheint nun folgendes:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-XV1Ml5N_I/AAAAAAAAAIs/PThitp3DJ2k/image%5B74%5D.png?imgmax=800" width="128" height="33" /&gt; &lt;/p&gt;  &lt;p&gt;Cool! Nur was sagt uns dieses Ergebnis? Wir haben doch bisher nur ein Jahr angegeben und nichts weiter. Woher weiß denn Excel nun was wir wollen? Eigentlich weiß Excel rein gar nichts über unsere Absichten. Das Ergebnis kommt direkt von den Analysis Services und zeigt den Wert des Default Measures “Reseller Sales Amount” an. Starten wir kurz den SQL Profiler und schauen uns mal die MDX Query an, welche Excel absendet für diese Abfrage. Dieses mal interessiert uns das Jahr 2004.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/S-XV3qUgTgI/AAAAAAAAAIw/hoGCy-c6jAA/image%5B82%5D.png?imgmax=800" width="589" height="367" /&gt; &lt;/p&gt;  &lt;p&gt;Hier die MDX Query im Detail: &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;SELECT {([Date].[Calendar Year].&amp;amp;[2004])} ON 0 FROM [Adventure Works] CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Auch hier steht nichts vom dem Measure, welches uns tatsächlich interessiert. In unserem Beispiel soll es um den “Internet Sales Amount” gehen. MDX ist bekanntlicherweise nicht ganz einfach und denkt sich schon mal seinen Teil, wenn etwas weggelassen wird. Warum stresse ich diesen Punkt hier? Wenn ich mit den Cube Funktionen arbeiten möchte, dann sind zumindest Grundkenntnisse in MDX hilfreich! &lt;/p&gt;  &lt;p align="center"&gt;Und MDX ist u.a. die Kunst des Weglassens. &lt;/p&gt;  &lt;p&gt;Aber wieder zurück in die Zelle mit unserer Formel. Bearbeiten wir unsere Formel und ergänzen diese mit einem Semikolon um den Wunsch nach einem weiteren Parameter.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/S-XV427nhHI/AAAAAAAAAI0/Qr45fAyTZPc/image%5B94%5D.png?imgmax=800" width="267" height="257" /&gt; &lt;/p&gt;  &lt;p&gt;Nun steuern wir die Dimension [Measures] an. Moment mal, warum denn die Dimension Measures? Teilt sich ein Cube nicht in Dimensionen und Measures auf? Nun ja, noch ein Beweis dafür, dass wir auf der dunklen Seite der Macht unterwegs sind. Für MDX sind Measures nichts weiter als eine Art weitere Dimension! Wählen wir den “Internet Sales Amount” aus.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XV6-gAieI/AAAAAAAAAI4/v59t4BHZKoM/image%5B93%5D.png?imgmax=800" width="267" height="231" /&gt; &lt;/p&gt;  &lt;p&gt;Hmm, langsam wir die Formel recht lang.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/S-XV7kmavTI/AAAAAAAAAI8/foLx_pii8Cc/s1600-h/image%5B98%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XV8wB4X9I/AAAAAAAAAJA/WEV_iwOsbzI/image_thumb%5B33%5D.png?imgmax=800" width="688" height="47" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Aber wir bekommen nun unseren Wert. &lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XV9sU17eI/AAAAAAAAAJE/TujuWRxcnu0/image%5B103%5D.png?imgmax=800" width="130" height="34" /&gt; &lt;/p&gt;  &lt;p&gt;Kurz in der klassischen Pivot Darstellung überprüft:&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-XV_DLp9jI/AAAAAAAAAJI/hY1gbSX9JRM/image%5B108%5D.png?imgmax=800" width="244" height="122" /&gt; &lt;/p&gt;  &lt;p&gt;Stimmt! Und was dem geneigten Leser vielleicht aufgefallen ist, ist die Tatsache, dass auch bei den Cube Funktionen die Formatierung als Währung mit übergeben wurde vom Cube. Wie praktisch.&lt;/p&gt;  &lt;p&gt;Nun wollen wir den Wert noch weiter filtern. Also Formel wieder bearbeiten und durch ein weiteres Semikolon einen weiteren Parameter beginnen. Die Eingabe der Anführungszeichen bringt uns wieder in die Auswahlbox. Hier wählen wir “[Customer]” und geben wieder einen Punkt an für den nächsten Level. Das machen wir bis wir “[Customer].[Customer Geography].[All Customers].[Germany]” zusammen haben.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XWAVt245I/AAAAAAAAAJM/75L58zmE4xk/image%5B118%5D.png?imgmax=800" width="433" height="172" /&gt; &lt;/p&gt;  &lt;p&gt;Wie Ihr seht, kommen wir auch direkt an die Länder innerhalb der Dimension. Wie komfortabel! Darüber hätten wir weiter oben übrigens auch das Jahr auswählen können. Ihr erinnert Euch?&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/S-XWBidq2lI/AAAAAAAAAJQ/iV01_D2iiHs/image%5B125%5D.png?imgmax=800" width="556" height="105" /&gt; &lt;/p&gt;  &lt;p&gt;Wir können also direkt die Formel bearbeiten oder quasi alles das AutoVervollständigen erledigen lassen. Wie ist eigentlich nun unser Wert?&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XWCP8jUxI/AAAAAAAAAJU/t8ZYFUVKBcI/image%5B130%5D.png?imgmax=800" width="126" height="31" /&gt; &lt;/p&gt;  &lt;p&gt;Schick! Und, stimmt er? Schnell wieder ein klassisches Pivot genutzt.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-XWDsvbL_I/AAAAAAAAAJY/yPtQmh2IjRw/image%5B136%5D.png?imgmax=800" width="335" height="227" /&gt; &lt;/p&gt;  &lt;p&gt;Strike! Was für ein Spaß, oder? Wenn wir uns nun vorstellen, dass wir noch weitere Dimension schneiden wollen, dann stellt sich schnell die Frage nach dem Nutzen der Cube Funktionen. Das ist doch recht umständlich!?!&lt;/p&gt;  &lt;p&gt;Wenn wir so weitermachen würden wie bisher, dann ist das tatsächlich recht mühsam und auch ohne echten Nutzen in Excel. Aber wir haben uns bisher ja auch nur eine von 7 Funktionen angeschaut. Und wie so häufig liegt der Nutzen in der Kombination!&lt;/p&gt;  &lt;p&gt;Kommen wir zur Excel Funktion CUBEMENGE. Laut Doku bekommen wir damit einen berechneten Satz von Elementen oder Tupeln. Na super, probieren wir das mal aus. Die Basics kennen wir ja schon.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/S-XWEhqexyI/AAAAAAAAAJc/oVxuR3sH47M/image%5B142%5D.png?imgmax=800" width="593" height="60" /&gt; &lt;/p&gt;  &lt;p&gt;Jetzt brauchen wir einen Mengen Ausdruck? Ok, schauen wir mal.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/S-XWFgrGoKI/AAAAAAAAAJg/fERpoDysK-A/image%5B149%5D.png?imgmax=800" width="609" height="70" /&gt; &lt;/p&gt;  &lt;p&gt;So, und das ergänzen wir jetzt noch um ein “.children”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/S-XWGe3ob_I/AAAAAAAAAJk/0JeVleIUrzo/s1600-h/image%5B153%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XWGy4IMwI/AAAAAAAAAJo/tNBw1OQsQ9A/image_thumb%5B57%5D.png?imgmax=800" width="188" height="49" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Damit sollten wir, sofern mich meine MDX Kenntnisse nicht komplett verlassen haben, ein Set (Menge) bekommen. Und los! Und was kommt dabei raus?&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-XWHqK7rkI/AAAAAAAAAJs/bUWQx4saxP8/image%5B159%5D.png?imgmax=800" width="114" height="35" /&gt; &lt;/p&gt;  &lt;p&gt;Nee, schon klar. Was ist das jetzt? Ein Set! Wie soll auch Excel eine unbekannte Anzahl an Daten in nur einer Zelle darstellen? Nur was soll das dann? Und wie bekommen wir raus, was sich dort befindet?&lt;/p&gt;  &lt;p&gt;Als erstes nutzen wir mal den Parameter, um eine Beschriftung zu hinterlegen.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/S-XWIMqiu9I/AAAAAAAAAJw/L3H26ndBghk/image%5B165%5D.png?imgmax=800" width="649" height="47" /&gt; &lt;/p&gt;  &lt;p&gt;Damit haben wir nun zumindest dort was stehen.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XWKAen5uI/AAAAAAAAAJ0/W62kShdtOLw/image%5B171%5D.png?imgmax=800" width="107" height="36" /&gt; &lt;/p&gt;  &lt;p&gt;Aber was steckt da nun hinter? Nehmen wir gleich mal die nächste Cube Funktion und zwar CUBEMENGENANZAHL. Diese braucht nur einen Parameter und zwar eine Menge. Das trifft sich gut, da wir ja gerade eine über. Also los.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/S-XWKpE-RcI/AAAAAAAAAJ4/EmrukKRaiZw/s1600-h/image%5B175%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XWLRrmx7I/AAAAAAAAAJ8/GXDU9P8RuS0/image_thumb%5B66%5D.png?imgmax=800" width="190" height="77" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Und was kommt raus?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/S-XWMBvqYxI/AAAAAAAAAKA/PY4h4WEIP_c/s1600-h/image%5B179%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/S-XWMp98igI/AAAAAAAAAKE/S6M6Tllp75s/image_thumb%5B68%5D.png?imgmax=800" width="98" height="80" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In unserer “unsichtbaren” Menge stecken also 6 Elemente. Schauen wir uns diese mal an. Und dazu kommt gleich die nächste Cube Funktion ins Spiel und zwar CUBERANGELEMENT.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/S-XWNL_NHKI/AAAAAAAAAKI/ySklWYBeDSg/s1600-h/image%5B185%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/S-XWOOQA2dI/AAAAAAAAAKM/twQjuNu49kQ/image_thumb%5B72%5D.png?imgmax=800" width="457" height="55" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Auch brauchen wir wieder eine Menge (F8) und einen Rang, sprich die Ansage das wievielte Element unserer Menge wir haben wollen. Und was ist das erste Element?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/S-XWOpeZqfI/AAAAAAAAAKQ/2jU3gCh__-A/s1600-h/image%5B189%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XWPPM_lxI/AAAAAAAAAKU/Pjw19WTw4nE/image_thumb%5B74%5D.png?imgmax=800" width="93" height="53" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ok, das ist doch schon mal was. Holen wir uns die restlichen fünf Elemente dazu. Und damit wir den Rang nun nicht manuell durchzählen, legen wir erst mal eine Zahlenreihe daneben. Dann können wir die Formel gleich schön runterziehen. Statt mit der Zahlenreihe zu arbeiten wäre auch die Verwendung von ZEILE(A1) möglich. Das ist ein alter Excel Trick, um aus dem nichts eine Zahlenreihe innerhalb von Formeln zu erzeugen. Aber zurück zu unserem Beispiel.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/S-XWP4HAvyI/AAAAAAAAAKY/wHKaVZ4s3wg/s1600-h/image%5B195%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-XWRvw_HWI/AAAAAAAAAKc/aV3f9EJMGr0/image_thumb%5B78%5D.png?imgmax=800" width="482" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Cool, nun haben wir schon unsere Vertriebsgebiete. &lt;/p&gt;  &lt;p&gt;Ein paar Zahlen wären nun ganz nett, oder? Da kommt unser alter Freund CUBEWERT wieder ins Spiel. Aber vorher sollten wir nur noch kurz festlegen welche Measures wir sehen wollen. Das können wir ebenfalls hinterlegen. Wir nutzen wir dafür die Cube Funktion CUBEELEMENT.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/S-XWUgygPgI/AAAAAAAAAKg/_rvbFpSf4xw/s1600-h/image%5B201%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/S-XWXFNQyKI/AAAAAAAAAKk/SxpyS1pjfyM/image_thumb%5B82%5D.png?imgmax=800" width="570" height="221" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nehmen wir wieder unseren “Internet Sales Amount”. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/S-XWYGllk2I/AAAAAAAAAKs/XLvVGDUyneM/s1600-h/image%5B207%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XWZZya1aI/AAAAAAAAAKw/He5Om7yHE_A/image_thumb%5B86%5D.png?imgmax=800" width="452" height="155" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Und die “Internet Freight Cost” haben wir gleich daneben gelegt. Was haben wir denn nun davon außer einer Überschrift? Das sehen wir, wenn wir nun endlich die CUBEWERT Funktion nutzen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/S-XWaHheztI/AAAAAAAAAK0/1RVIxg4REmE/s1600-h/image%5B213%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XWcHIjjGI/AAAAAAAAAK4/R8-f6dSpJJk/image_thumb%5B90%5D.png?imgmax=800" width="527" height="76" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nun bauen wir uns nämlich die Parameter einfach ein. Zuerst kommt das Gebiet.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/S-XWef3epXI/AAAAAAAAAK8/vyHtasjEcRw/s1600-h/image%5B219%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/S-XWf6M7j9I/AAAAAAAAALA/qBh6EW605tE/image_thumb%5B94%5D.png?imgmax=800" width="524" height="60" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Und das erste Measure. Und damit haben wir für den Moment bereits alles zusammen. Das ging doch nun viel schneller, oder?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/S-XWg5QqPEI/AAAAAAAAALI/F-4dRWVsjUo/s1600-h/image%5B224%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-XWipJxYkI/AAAAAAAAALM/Q6rTIGbduis/image_thumb%5B97%5D.png?imgmax=800" width="459" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Damit haben eine Zahl! Nun die Formel auf die restlichen Zellen kopieren und schon haben wir den Rest!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/S-XWjp8n7CI/AAAAAAAAALQ/4WisnVCmV2c/s1600-h/image%5B230%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-XWl2kWrbI/AAAAAAAAALU/Lo-JvYaCk9k/image_thumb%5B101%5D.png?imgmax=800" width="471" height="160" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Das ging doch nun richtig schnell, oder? Glückwunsch, damit sind wir schon recht weit gekommen. Alles was uns für den Moment fehlt ist ein wenig Interaktivität, oder?&amp;#160; Dazu nutzen wir Filter vom PivotTable ohne die starre Struktur eines solchen zu verwenden. Wie das? Dafür fügen wir an einer freien Stelle einen PivotTable basierend auf der bisher auch verwendeten Verbindung ein. Warum eine freie Stelle? Sonst wird unsere bisherige Arbeit überschrieben! &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1gJtalph07w/S-XWt-x1mAI/AAAAAAAAALY/3b1JUef6w0U/s1600-h/image%5B237%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-ZasJlMQLI/AAAAAAAAALc/iRurBNbzcVc/image_thumb%5B106%5D.png?imgmax=800" width="602" height="427" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Da ist nun unser PivotTable. Was machen wir nun damit?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/S-ZauCsFDPI/AAAAAAAAALg/kN_fKi1fHto/s1600-h/image%5B242%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/S-ZawVYiTHI/AAAAAAAAALk/3KOluZ-sUTw/image_thumb%5B109%5D.png?imgmax=800" width="641" height="309" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Wir fügen in den Berichtsfilter die Hierarchien “Date Calendar” und “Produkt Categories” ein. Das war es schon! Dann markieren wir die beiden Filterzeilen und verschieben diese über unsere Tabelle.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/S-ZaxIBKzDI/AAAAAAAAALo/m8e-N-x4z0o/s1600-h/image%5B249%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-Za04_tYbI/AAAAAAAAALs/ZlkgshgX8YQ/image_thumb%5B114%5D.png?imgmax=800" width="456" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Es liegt Business Intelligence in der Luft, oder? Nun noch schnell die CUBEWERT Formeln erweitern um die beiden Filter (G5 &amp;amp; G6). Und schön auf alle Zellen kopieren.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1gJtalph07w/S-Za3H4MpdI/AAAAAAAAALw/5Qyx95B085Y/s1600-h/image%5B255%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_1gJtalph07w/S-Za95psujI/AAAAAAAAAL0/f3bW49IEuco/image_thumb%5B118%5D.png?imgmax=800" width="556" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Und nun können wir die Filter nutzen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1gJtalph07w/S-Za_pQoNNI/AAAAAAAAAL4/nmUUPyGdBlk/s1600-h/image%5B260%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_1gJtalph07w/S-ZbB3K2AqI/AAAAAAAAAL8/7ZYFD9sIzw4/image_thumb%5B121%5D.png?imgmax=800" width="437" height="296" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Und die Auswahl wirkt sich jeweils sofort auf unsere Zahlen aus!&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/S-ZbC6Q2MOI/AAAAAAAAAMA/8AbHNsZMBi0/s1600-h/image%5B266%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_1gJtalph07w/S-ZbFouKsTI/AAAAAAAAAME/k-mQWTYKamM/image_thumb%5B125%5D.png?imgmax=800" width="456" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Damit haben wir nun in unserem Arbeitsblatt die Möglichkeit geschaffen direkt auf Cube Daten zuzugreifen ohne die starre Struktur einer PivotTable. Des Weiteren haben wir gleich noch zwei interaktive Filter eingebaut. Das ist schon mal gutes Handwerkszeug, um anspruchsvollere Controllingaufgaben zu meistern. Nun können wir eine weitere Dimensionen hinzufügen und noch ein kleines Chart. Die notwendige Basis dafür haben wir schon geschaffen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1gJtalph07w/S-ZbI1o6VDI/AAAAAAAAAMI/9iyZCT3ri80/s1600-h/image%5B277%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_1gJtalph07w/S-ZbKmV0GQI/AAAAAAAAAMM/MGvqTZSaiWc/image_thumb%5B132%5D.png?imgmax=800" width="657" height="263" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Das mag von der Komplexität und der nötigen Zeit her aufwändig erscheinen, aber mit ein klein wenig Übung geht das schnell und zügig von Hand und der Excel Profi wird diese Möglichkeit einfach und schnell mit immer aktuellen Zahlen zu arbeiten nicht mehr missen wollen. Wann immer sich die Daten im Analysis Services Cube ändern bzw. weitere Daten dazu kommen, werden auch die Informationen im Arbeitsblatt aktualisiert.&lt;/p&gt;  &lt;p&gt;Ich hoffe, dass ich dem einen oder anderen mit dieser Schritt-für-Schritt Anleitung einen Einstieg in die Arbeit mit den Cube Funktionen von Excel ermöglicht habe. Viel Freude damit!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574504-5650642520327888872?l=saschalorenz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5650642520327888872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574504/posts/default/5650642520327888872'/><link rel='alternate' type='text/html' href='http://saschalorenz.blogspot.com/2010/05/cube-funktionen-in-excel-2007-2010.html' title='Cube Funktionen in Excel 2007 &amp;amp; 2010'/><author><name>Sascha Lorenz</name><uri>http://www.blogger.com/profile/13002884600414156236</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_1gJtalph07w/S-XVkA50_5I/AAAAAAAAAIA/387Bh7M6ZGU/s72-c/image%5B18%5D.png?imgmax=800' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-11574504.post-8823684251861608849</id><published>2010-04-30T20:53:00.001+02:00</published><updated>2010-04-30T20:53:48.625+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Brust oder Keule?</title><content type='html'>&lt;p&gt;Gestern Abend habe ich einen sehr interessanten Satz gehört: “Wir setzen Reporting Service in Fachabteilungen nicht ein, weil dort SQL Abfragen erstellt werden müssen. Das ist nichts für unsere Anwender/Kunden.”&lt;/p&gt;  &lt;p&gt;Das hat mich daran erinnert, dass ich häufig höre, dass Analysis Services ja viel zu kompliziert sei für Fachabteilungen, weil die Erstellung von Cubes mit dem BIDS nur was für IT’ler sei. Aber das Handling mit Excel sei eigentlich ganz cool.&lt;/p&gt;  &lt;p&gt;Solche Diskussionen zeigen, dass selbst IT-Professionals (und auch der eine oder andere ambitionierte Endanwender) häufig eine GUI mit dem eigentlichen Service verwechseln. Und natürlich gibt deises keiner zu. :-)&lt;/p&gt;  &lt;p&gt;Am Beispiel Reporting Services heißt das konkret, dass Report Builder 2.0/3.0 und das BIDS NUR die Tools von Microsoft zur Erstellung der RDL Files und Datenquellen sind. die eigentliche Power steckt im Dienst. Des Weiteren gibt es noch 3rd Party Tools, welche ebenfalls RDL Files erstellen können. Ein bekanntes Tool dafür ist Officewriter von softartisans: &lt;a title="http://officewriter.softartisans.com/officewriter-250.aspx" href="http://officewriter.softartisans.com/officewriter-250.aspx"&gt;http://officewriter.softartisans.com/officewriter-250.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Die SQL Server RDL Specification kann natürlich auch in eigenen Projekten genutzt werden: &lt;a title="http://msdn.microsoft.com/en-us/library/dd297486.aspx" href="http://msdn.microsoft.com/en-us/library/dd297486.aspx"&gt;http://msdn.microsoft.com/en-us/library/dd297486.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wenn wir Analysis Services betrachten, dann kommen u. a. die Analysis Management Objects (AMO) ins Spiel. Mittels dieser können Cubes und was dazu gehört erzeugt werden. Und wieder ist das offizielle Tool von Microsoft das BIDS und es gibt natürlich eine ganze Reihe von 3rd Party Tools (häufig was mit Accelerator im Namen) die diesen Job erledigen k
