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

<channel>
	<title>Communardo Techblog &#187; SQL2008</title>
	<atom:link href="http://www.communardo.de/home/techblog/tag/sql2008/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.communardo.de/home/techblog</link>
	<description></description>
	<lastBuildDate>Fri, 30 Jul 2010 12:18:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL PASS Treffen am 25.01.2010 in Dresden</title>
		<link>http://www.communardo.de/home/techblog/2010/01/19/sql-pass-treffen-am-25-01-2010-in-dresden/</link>
		<comments>http://www.communardo.de/home/techblog/2010/01/19/sql-pass-treffen-am-25-01-2010-in-dresden/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 10:18:05 +0000</pubDate>
		<dc:creator>Dorrit Riemenschneider</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[reporting]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL PASS]]></category>
		<category><![CDATA[SQL2008]]></category>
		<category><![CDATA[UserGroup]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=2892</guid>
		<description><![CDATA[<img alt="dri" src="http://www.gravatar.com/avatar.php/787c944feb23a1f3f8e2bd4d150fa67d/?s=76" class="com-blog-icon"/><a href="http://www.communardo.de/home/techblog/author/dri/" title="Artikel von Dorrit Riemenschneider">Dorrit Riemenschneider</a><p>Alle<strong> SQL PASS</strong>ler aus Sachsen (und die, die es werden m&#246;chten) sind zum Jubil&#228;umstreffen 5 Jahre PASS Deutschland der Regionalgruppe Sachsen am<strong> Montag, den 25.01.2010 um 18:30 Uhr</strong> einladen.</p>
<p>Der <a href="http://www.sqlpass.de/">PASS Deutschland e.V.</a> wurde am 31.08.2004 gegr&#252;ndet und feierte deshalb im August/September 2009 in allen Regionen das f&#252;nfj&#228;hrige Bestehen. Zu diesem Jubil&#228;um wurden in allen Regionen Treffen der Regionalgruppen mit besonderen Inhalt veranstaltet. F&#252;r die Regionalgruppe Sachsen war folgender Vortrag anberaumt:</p>
<p><em><strong>SQL Server 2008 R2: Neues vom SQL Server; Georg Urban, Microsoft</strong></em></p>
<p><em>Self Service Analysis mit Excel In-Memory Online Analytic Processing &amp; Self Service Reporting mit Report Builder 3.0 sind wichtige Themen – aber es gibt noch mehr zu berichten</em>.</p>
<p>Da Georg Urban zu dem ersten Versuch im September kurzfristig krank geworden war, hat er sich f&#252;r den 25. Januar bereit erkl&#228;rt, die Session nachzuholen. Es darf gehofft werden, dass er nun auch die neueste CTP vom November hat und die Teilnehmenden so in den Genuss von „Hot News“ kommen!</p>
<p>Die PASS Regionalgruppe Dresden trifft sich an gewohnter Stelle im IT-Trainingshaus am Waldschl&#246;sschen. N&#228;here Informationen zum Termin und eine Anfahrtsbeschreibung findet man auf der <a href="http://www.sqlpass.de/Regionalgruppen/Sachsen/tabid/86/Default.aspx">Website der Regionalgruppe</a>.</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2010/01/19/sql-pass-treffen-am-25-01-2010-in-dresden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jubil&#228;umsveranstaltung der SQL Pass zu BI: ausgefallen und doch stattgefunden</title>
		<link>http://www.communardo.de/home/techblog/2009/09/09/jubilaeumsveranstaltung-der-sql-pass-zu-bi-ausgefallen-und-doch-stattgefunden/</link>
		<comments>http://www.communardo.de/home/techblog/2009/09/09/jubilaeumsveranstaltung-der-sql-pass-zu-bi-ausgefallen-und-doch-stattgefunden/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 07:56:11 +0000</pubDate>
		<dc:creator>Dorrit Riemenschneider</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[Reportdesign]]></category>
		<category><![CDATA[reporting]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL PASS]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL2008]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=1955</guid>
		<description><![CDATA[<img alt="dri" src="http://www.gravatar.com/avatar.php/787c944feb23a1f3f8e2bd4d150fa67d/?s=76" class="com-blog-icon"/><a href="http://www.communardo.de/home/techblog/author/dri/" title="Artikel von Dorrit Riemenschneider">Dorrit Riemenschneider</a><p>Am 07.09.2009 fand in Dresden die bereits im Vorfeld <a href="http://www.communardo.de/techblog/2009/08/17/jubilaeumsveranstaltung-bei-sql-pass-sachsen/">hier</a> erw&#228;hnte Jubil&#228;umsveranstaltung der SQL Pass Group statt. Thema sollte die bevorstehende Release 2 von SQL Server 2008 (Codename <em>Madison</em>) mit ihren M&#246;glichkeiten zu Self Service BI, SQL Server Data Warehouse Scale Out und weiteren Neuheiten sein.</p>
<p>Leider musste Sprecher Georg Urban wegen Krankheit kurzfristig absagen, weshalb die Veranstaltung wohl h&#228;tte ins Wasser fallen m&#252;ssen, wenn PASS-Organisator Ralf Dietrich nicht einen vollwertigen Ersatz &#8220;besorgt&#8221; h&#228;tte: <a href="http://www.andreas-wolter.com/">Andreas Wolter</a> informierte &#252;ber <strong><em>Reporting Services 2008 Berichtsdesign Features</em></strong>.</p>
<p>Berichte auf Basis der Reporting Services 2008 sehen auf den ersten Blick mit RS 2005 fast identisch aus. Unter der Haube aber ergeben sich ganz neue M&#246;glichkeiten. Andreas Wolter stellte neue bzw. verbesserte Features wie <em>Tablix, Charts und Gauges (KPI) </em>mit m&#246;glichen Anwendungsszenarien vor. Zum Schluss gab es mit dem aktuellen <a href="http://blogs.msdn.com/sqlrsteamblog/archive/2009/08/14/report-builder-3-0-august-ctp.aspx">Report Builder 3.0 CTP</a> doch noch einen Vorab-Blick auf Release 2, dort stachen insbesondere die wirklich gut integrierten <a href="http://www.geowebguru.com/news/196-bing-maps-to-be-in-sql-server-2008-r2-reporting-services">Bing Maps</a> sehr positiv hevor.</p>
<p>Am Ende waren sich alle darin einig, dass es ein &#228;u&#223;erst informativer Vortrag (daf&#252;r ein Dankesch&#246;n an Andreas)  zu einem interessanten Thema und deutlich mehr als ein &#8220;L&#252;ckenb&#252;&#223;er&#8221; (und daf&#252;r noch eines an Ralf, der dies noch so kurzfristig &#8220;heranorganisierte&#8221;) war!</p>
<p>Am 20.11.2009 ist das n&#228;chste Treffen der PASS Regionalgruppe Sachsen angesetzt, Thema wird <em>SQL Server Sizing</em> mit einer kurzen Einf&#252;hrung und anschlie&#223;ender Diskussion/ Erfahrungsaustausch sein. Der am Montag ausgefallende Vortrag von Georg Urban soll nicht aufgehoben, sondern nur aufgeschoben sein: geplant ist Januar 2010, der konkrete Termin wird dann rechtzeitig auf der <a href="http://www.sqlpass.de/Regionalgruppen/Sachsen/tabid/86/Default.aspx">Webseite der Regionalgruppe Sachsen</a> bekannt gegeben.</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2009/09/09/jubilaeumsveranstaltung-der-sql-pass-zu-bi-ausgefallen-und-doch-stattgefunden/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jubil&#228;umsveranstaltung bei SQL Pass Sachsen</title>
		<link>http://www.communardo.de/home/techblog/2009/08/17/jubilaeumsveranstaltung-bei-sql-pass-sachsen/</link>
		<comments>http://www.communardo.de/home/techblog/2009/08/17/jubilaeumsveranstaltung-bei-sql-pass-sachsen/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 07:45:35 +0000</pubDate>
		<dc:creator>Dorrit Riemenschneider</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[Business Intelligence]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL PASS]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL2008]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=1829</guid>
		<description><![CDATA[<img alt="dri" src="http://www.gravatar.com/avatar.php/787c944feb23a1f3f8e2bd4d150fa67d/?s=76" class="com-blog-icon"/><a href="http://www.communardo.de/home/techblog/author/dri/" title="Artikel von Dorrit Riemenschneider">Dorrit Riemenschneider</a><p>Das n&#228;chste SQL Pass Treffen der <a href="http://www.sqlpass.de/Regionalgruppen/Sachsen/tabid/86/Default.aspx" target="_blank">Regionalgruppe Sachsen<img src="http://i.ixnp.com/images/v6.2/t.gif" alt="" /></a> findet bereits am 07.09.2009 18:30 wie gewohnt im <a href="http://www.it-trainingshaus.de/" target="_blank">IT Trainingshaus<img src="http://i.ixnp.com/images/v6.2/t.gif" alt="" /></a> (mittlerweile in den neuen R&#228;umlichkeiten im 4. Obergeschoss) statt.</p>
<p>Es gibt eine <a href="http://blogs.technet.com/sqlteamgermany/archive/2009/06/18/5-jahre-pass-deutschland-e-v-und-wir-sind-dabei.aspx">Jubil&#228;umsveranstaltung</a> anl&#228;sslich des 5-j&#228;hrigen Bestehens von <a href="http://www.sqlpass.de/" target="_blank">PASS Deutschland e.V.</a> und einen Vortrag zum Thema <strong>&#8220;SQL Server 2008 R2: Self Service BI, SQL Server Data Warehouse Scale Out und weitere Neuheiten&#8221;</strong>.</p>
<p>Anmelden kann man sich wie immer mit einer kurzen Mail an Ralf Dietrich (<span><a href="mailto:rdi@sqlpass.de">rdi@sqlpass.de</a></span>) oder an Ulrich Walter (<span><a href="mailto:uwa@sqlpass.de">uwa@sqlpass.de</a></span>). Weitere Informationen gibt es auf der <a href="http://www.sqlpass.de/Regionalgruppen/Sachsen/tabid/86/Default.aspx">Homepage</a> der Regionalgruppe Sachsen.</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2009/08/17/jubilaeumsveranstaltung-bei-sql-pass-sachsen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SQLdays – Die Fachkonferenz f&#252;r den Microsoft SQL Server!</title>
		<link>http://www.communardo.de/home/techblog/2009/07/14/sqldays-die-fachkonferenz-fuer-den-microsoft-sql-server/</link>
		<comments>http://www.communardo.de/home/techblog/2009/07/14/sqldays-die-fachkonferenz-fuer-den-microsoft-sql-server/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 13:04:00 +0000</pubDate>
		<dc:creator>Dorrit Riemenschneider</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[konferenz]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL2008]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=1701</guid>
		<description><![CDATA[<img alt="dri" src="http://www.gravatar.com/avatar.php/787c944feb23a1f3f8e2bd4d150fa67d/?s=76" class="com-blog-icon"/><a href="http://www.communardo.de/home/techblog/author/dri/" title="Artikel von Dorrit Riemenschneider">Dorrit Riemenschneider</a><table class="MsoTableGrid" style="border: medium none;border-collapse: collapse" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="padding: 0cm 5.4pt" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.01pt;line-height: normal"><img class="alignleft size-medium wp-image-1702" src="http://www.communardo.de/techblog/wp-content/uploads/2009/07/SQLdays-300x115.gif" alt="SQLdays" width="189" height="73" /></p>
</td>
<td style="padding: 0cm 5.4pt" valign="top">
<p class="MsoNormal" style="margin-bottom: 0.0001pt;line-height: normal">Communardo ist Partner der <strong>SQL<em>days</em></strong>, die von <em> </em><strong>29.-30. September 2009</strong> in Rosenheim stattfinden.</p>
<p class="MsoNormal" style="margin-bottom: 0.0001pt;line-height: normal">Sichern Sie sich am besten noch heute Ihre Teilnahme und sparen Sie so mit Promocode <strong>„SQL-Com89“</strong> mindestens 100,- EUR auf den Konferenzpreis (bis 31. August 2009)!</p>
</td>
</tr>
</tbody>
</table>
<p><span style="color: #ffffff">.</span></p>
<p>Seien auch Sie 2009 bei den <strong>SQL<em>days</em></strong> mit dabei – wenn es hei&#223;t „<strong>Von Profis f&#252;r Profis</strong>“. So erfahren Sie im Detail, was der innovative Datenbank Server von Microsoft zu bieten hat, welche Trends aktuell sind und von welchen Tipps &amp; Tricks Sie pers&#246;nlich profitieren.</p>
<p><strong>Und das sind die Highlights der SQL<em>days </em>2009:</strong></p>
<ul>
<li>Profitieren Sie von <strong>&#252;ber 20</strong> vollgepackten <strong>70-Minuten-Sessions</strong> in <strong>drei Tracks</strong> – <strong>Administration, Development und Business Intelligence</strong>.</li>
</ul>
<ul>
<li><strong>Session-Highlights: </strong>
<ul>
<li>Gemini und Du: Ger&#252;chte &#252;ber Microsofts BI-Selbstbedienungsladen</li>
<li>Reporting Services 2008 und Analysis Services: Passt das jetzt?</li>
<li>Big Data &#8211; SQL Server 2008 vs. gro&#223;e Tabellen!</li>
<li>Einf&#252;hrung in das FILESTREAM Storage Attribut des SQL Server 2008</li>
<li>Sch&#228;tze f&#252;r Microsoft BI, gefunden auf Codeplex</li>
</ul>
</li>
<li>H&#246;ren Sie die<strong> SQL-Experten</strong> Steffen Krause, Markus Raatz, Georg Urban und viele weitere Sprecher</li>
<li><strong>Neu:</strong> Spezieller Pre- und Postkonferenz-<strong>Workshop</strong>
<ul>
<li>Mo., 28. September 2009: <strong>One Day Wonder &#8211; In einem Tag zum Admin</strong></li>
<li>Do., 01. Oktober 2009: <strong>Erstellen einer Data Warehouse- /Business Intelligence-L&#246;sung mit dem SQL Server 2008 R2</strong></li>
</ul>
</li>
</ul>
<p>Aktuelle Infos zu den <strong>SQL<em>days</em></strong>, zu allen <strong>Sessions</strong>, allen <strong>Sprechern</strong>, den <strong>Workshops</strong> und <strong>Anmeldung</strong> unter <a href="http://www.sqldays.net/"><strong>www.SQL<em>days</em>.net</strong></a>.</p>
<div style="overflow: hidden;width: 1px;height: 1px"><!--[if !mso]&gt; &lt;!  v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} --> <!--[endif]--><!--[if gte mso 9]&gt;  Normal 0 false  21   false false false  DE X-NONE X-NONE                           &lt;![endif]--><!--[if gte mso 9]&gt;                                                                                                                                              &lt;![endif]--><!--  /* Font Definitions */  @font-face 	{font-family:"Cambria Math"; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:roman; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face 	{font-family:Calibri; 	panose-1:2 15 5 2 2 2 4 3 2 4; 	mso-font-charset:0; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-1610611985 1073750139 0 0 159 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:""; 	margin-top:0cm; 	margin-right:0cm; 	margin-bottom:10.0pt; 	margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:Calibri; 	mso-fareast-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi; 	mso-fareast-language:EN-US;} .MsoPapDefault 	{mso-style-type:export-only; 	margin-bottom:10.0pt; 	line-height:115%;} @page Section1 	{size:612.0pt 792.0pt; 	margin:70.85pt 70.85pt 2.0cm 70.85pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --><!--[if gte mso 10]&gt; &lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Normale Tabelle&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-fareast-language:EN-US;} --> <!--[endif]--><!--[if gte mso 9]&gt;  &lt;![endif]--><!--[if gte mso 9]&gt;   &lt;![endif]--></p>
<p class="MsoNormal"><!--[if gte vml 1]&gt;                     &lt;![endif]--><!--[if !vml]--><img src="/Users/dri/AppData/Local/Temp/msohtmlclip1/01/clip_image001.jpg" alt="http://www.ppedv.de/events/sqldays.jpg" hspace="12" width="140" height="100" align="left" /><!--[endif]--><strong>SQL<em>days </em>– Die Fachkonferenz f&#252;r den Microsoft SQL Server!<br />
</strong><span style="text-decoration: underline">Melden Sie sich bis 31. August 2009 mit Promocode „SQL-Com89“ an und sichern Sie sich Ihren Sonderpreis!</span><strong><br />
</strong><em>29.-30. September 2009, Rosenheim (Obb)</em></p>
<p class="MsoNormal">
<p>Communardo ist Partner der <strong>SQL<em>days</em></strong>, die von <em> </em><strong>29.-30. September 2009</strong> in Rosenheim stattfinden.</div>
]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2009/07/14/sqldays-die-fachkonferenz-fuer-den-microsoft-sql-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neuerungen in SQL Server 2008: R&#228;umliche Datentypen</title>
		<link>http://www.communardo.de/home/techblog/2009/01/28/neuerungen-in-sql-server-2008-raeumliche-datentypen/</link>
		<comments>http://www.communardo.de/home/techblog/2009/01/28/neuerungen-in-sql-server-2008-raeumliche-datentypen/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 07:24:14 +0000</pubDate>
		<dc:creator>Martin Hey</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[Softwareentwicklung]]></category>
		<category><![CDATA[geography]]></category>
		<category><![CDATA[geometry]]></category>
		<category><![CDATA[SQL2008]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=969</guid>
		<description><![CDATA[<img alt="mhy" src="http://www.gravatar.com/avatar.php/b2628bda407a7ae43f62dd191beb6335/?s=76" class="com-blog-icon"/><a href="http://www.communardo.de/home/techblog/author/mhy/" title="Artikel von Martin Hey">Martin Hey</a><p>Genau wie der Datentyp <a href="http://www.communardo.de/techblog/2008/12/26/neuerungen-in-sql-server-2008-der-hierarchyid-datentyp/">HierarchyId</a>, so sind auch die neuen r&#228;umlichen Datentypen geometry und geography CLR-Datentypen, die in jeder Datenbank verf&#252;gbar sind &#8211; unabh&#228;ngig davon, ob CLR-Funktionen aktiviert sind.</p>
<p>Der <strong>geometry</strong>-Datentyp erlaubt die Darstellung von Daten im kartesischen Koordinatensystem und die Durchf&#252;hrung von Berechnungen mit diesen Daten.<br />
Das m&#246;chte ich an einem Beispiel verdeutlichen:<br />
<img class="alignnone size-full wp-image-970" src="http://www.communardo.de/home/techblog/files/2009/01/image3.png" alt="image3" width="345" height="336" /></p>
<p>In diesem Koordinatensystem befinden sich 2 geometrische Figuren. Ein Strahl mit den Endpunkten (0; 0), (100; 200) und ein Quadrat mit den Eckpunkten (-40; -40), (100; -40), (100; 100), und (-40, 100).</p>
<p>Die Deklaration einer Tabelle zur Speicherung der Daten ist recht trivial. Hierzu erzeugt man einfach eine Tabellenspalte vom Typ Geometry in die man die Daten schreibt.</p>
<p>Ich m&#246;chte hier allerdings auf die M&#246;glichkeiten des Datentyps eingehen. Daher werden in den folgenden Beispielen nur Variablen dieses Datentyps erzeugt. Mit Hilfe der statischen Methode STGeomFromText kann aus einem normalsprachlichen Text (dem sogenannten &#8220;Well Known Text&#8221; = WKT) eine geometrische Instanz erzeugt werden. Im Beispiel ist das:</p>
<table style="height: 71px" border="1" cellspacing="0" cellpadding="2" width="632">
<tbody>
<tr>
<td width="100%" valign="top"><span style="font-family: Courier New"><span style="color: #0000ff">DECLARE</span> @line <span style="color: #0000ff">geometry</span>;<br />
<span style="color: #0000ff">SET </span>@line = </span><span style="font-family: Courier New"><span style="color: #0000ff">geometry</span></span> <span style="font-family: Courier New">::STGeomFromText(<span style="color: #ff0000">&#8216;LINESTRING (0 0, 100 200)&#8217;</span>,0)</span><br />
<span style="font-family: Courier New"><span style="color: #0000ff">DECLARE </span></span><span style="font-family: Courier New">@rectangle </span><span style="font-family: Courier New"><span style="color: #0000ff">geometry</span></span><span style="font-family: Courier New">;<br />
</span><span style="font-family: Courier New"><span style="color: #0000ff">SET</span></span> <span style="font-family: Courier New">@rectangle = </span><span style="font-family: Courier New"><span style="color: #0000ff">geometry</span></span> <span style="font-family: Courier New">::STGeomFromText(<span style="color: #ff0000">&#8216;POLYGON ((-40 -40, 100 -40, 100 100, -40 100, -40 -40))&#8217;</span>,0)</span></td>
</tr>
</tbody>
</table>
<p>Wie man sieht, wird hier die Art der geometrischen Figur angegeben  und Punkte, die die Figur n&#228;her beschreiben. Das Quadrat ist verallgemeinert ein Polygon, daher ist der WKT hier POLYGON. Zu beachten ist bei Polygonen, dass Start- und Endpunkt &#252;bereinstimmen m&#252;ssen.</p>
<p>Soweit ganz gut. Das Erzeugen und Speichern von Daten an sich ist recht langweilig. Was k&#246;nnen die Methoden, die geometry zur Verf&#252;gung stellt?</p>
<p>STAsText: STAsText gibt den WKT f&#252;r ein geometry-Objekt zur&#252;ck.</p>
<p>STArea: Diese Funktion berechnet die Oberfl&#228;che von geometrischen Objekten.  Im Fall der Linie ist die Oberfl&#228;che 0, aber das ist ehrlich gesagt auch nicht verwunderlich. Im Fall des Quadrats hat die Methode korrekt 140 * 140 = 19600 zur&#252;ckgegeben.</p>
<p>STIntersection: Mit STIntersection wird die &#220;berschneidung zweier Objekte berechnet.    Das Ergebnis der Berechnung im Beispiel ist eine Linie mit den Endpunkten (0; 0) und (50; 100) &#8211; und genau das kann man auch sehr sch&#246;n im Diagramm ablesen.</p>
<p>STLength: Ein letztes Beispiel an dieser Stelle soll STLength sein. Wie der Name schon vermuten l&#228;sst, kann damit die L&#228;nge bzw. der Umfang der Objekte berechnet werden.</p>
<p>Die Anwendungsf&#228;lle daf&#252;r k&#246;nnen sehr vielf&#228;ltig sein. Beispielsweise k&#246;nnte hier die Entfernung zwischen Geb&#228;uden oder Objekten berechnet werden.</p>
<p>Die Berechnung von Entfernungen mit STLength oder Fl&#228;chen mit STArea auf geraden Fl&#228;chen ist nur dann sinnvoll, wenn es sich um kurze Distanzen handelt. M&#246;chte man Entfernungen in der realen Welt berechnen, ist der geometry-Datentyp aufgrund der Kr&#252;mmung der Erde nicht mehr geeignet. Der <strong>geography</strong>-Datentyp schafft hier Abhilfe:</p>
<p>Wie schon vom Geometry-Datentyp bekannt, kann ein Objekt mittels der statischen Methode STGeomFromText erzeugt werden. Allerdings spielt hier die dort recht unwichtige SRID hier eine wesentliche Rolle. Sie definiert, anhand welchen Standards Berechnungen durchgef&#252;hrt werden. In der MSDN findet man zum Thema folgendes:</p>
<blockquote><p>geometry Instances Default to Zero SRID</p>
<p>The default SRID for geometry instances in SQL Server is 0. With geometry spatial data, the specific SRID of the spatial instance is not required to perform calculations; thus, instances can reside in undefined planar space. To indicate undefined planar space in the calculations of geometry data type methods, the SQL Server Database Engine uses SRID 0.</p>
<p>geography Instances Must Use Supported SRID</p>
<p>SQL Server supports SRIDs based on the <a href="http://www.epsg.org/" target="_blank">EPSG</a> standards. A SQL Server-supported SRID for geography instances must be used when performing calculations or using methods with geography spatial data. The SRID must match one of the SRIDs displayed in the sys.spatial_reference_systems catalog view. As mentioned previously, when you perform calculations on your spatial data using the geography data type, your results will depend on which ellipsoid was used in the creation of your data, as each ellipsoid is assigned a specific spatial reference identifier (SRID).</p>
<p>SQL Server uses the default SRID of 4326, which maps to the WGS 84 spatial reference system, when using methods on geography instances. If you use data from a spatial reference system other than WGS 84 (or SRID 4326), you will need to determine the specific SRID for your geography spatial data.</p></blockquote>
<p>Im Gegensatz zu Geometry muss f&#252;r die Initialisierung der Geography-Objekte also zwingend eine SRID angegeben werden. Der Standard ist aktuell 4362. Eine &#220;bersicht der g&#252;ltigen SRIDs erh&#228;lt man, wenn man die Systemsicht sys.spatial_reference_systems aufruft:<br />
<img class="alignnone size-full wp-image-972" src="http://www.communardo.de/home/techblog/files/2009/01/image11.png" alt="image11" width="543" height="209" /></p>
<p>Es gibt noch eine weitere Einschr&#228;nkung: Geography-Instanzen d&#252;rfen die Hemisph&#228;re nicht &#252;berschreiten. Diese Einschr&#228;nkung spielt nat&#252;rlich erst dann eine Rolle, wenn man nicht mehr nur geographische Punkte speichert, sondern Berechnungen durchf&#252;hren m&#246;chte und z.B. Entfernungen berechnet. Eine in meinen Augen gute Erkl&#228;rung f&#252;r diese Einschr&#228;nkung liefert <a href="http://stevekass.com/2007/11/21/the-hemisphere-requirement/" target="_blank">ein Blogeintrag von Steve Kass zum Thema</a>. Darin wird auch gut beschrieben, weshalb die Punkte von Polygonen immer entgegen des Uhrzeigersinns angegeben werden m&#252;ssen.</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2009/01/28/neuerungen-in-sql-server-2008-raeumliche-datentypen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Neuerungen in SQL Server 2008: Der HierarchyId-Datentyp</title>
		<link>http://www.communardo.de/home/techblog/2008/12/26/neuerungen-in-sql-server-2008-der-hierarchyid-datentyp/</link>
		<comments>http://www.communardo.de/home/techblog/2008/12/26/neuerungen-in-sql-server-2008-der-hierarchyid-datentyp/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 18:37:50 +0000</pubDate>
		<dc:creator>Martin Hey</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[HierarchyId]]></category>
		<category><![CDATA[SQL2008]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=750</guid>
		<description><![CDATA[<img alt="mhy" src="http://www.gravatar.com/avatar.php/b2628bda407a7ae43f62dd191beb6335/?s=76" class="com-blog-icon"/><a href="http://www.communardo.de/home/techblog/author/mhy/" title="Artikel von Martin Hey">Martin Hey</a><p>M&#246;chte man hierarchische Daten ablegen &#8211; wie z.B. Organisationsstrukturen in  Unternehmen, so war das Standard-Vorgehen dazu bisher, 2 Felder zu verwenden &#8211;  zun&#228;chst die Id des eigentlichen Elements und in einem weiteren Feld die Id des  Elternknotens.</p>
<p><img class="alignnone size-full wp-image-751" src="http://www.communardo.de/home/techblog/files/2008/12/namenlos2.jpg" alt="Beispiel f&#252;r Speicherung hierarchischer Daten" width="493" height="250" /></p>
<p>Damit lassen sich Abfragen wie: &#8220;Wer ist direkter Vorgesetzter des Mitarbeiters X?&#8221; oder &#8220;Welche Mitarbeiter sind direkt dem Vorgesetzten Y unterstellt?&#8221; recht einfach beantworten. Umfangreichere Aussagen wie: &#8220;Was sind alle direkten und indirekten Mitarbeiter des Managers X?&#8221; oder &#8220;Wer ist Ebene-3-Manager des Mitarbeiters Y?&#8221; sind damit schon schwieriger zu ermitteln.</p>
<p>Nun kommt der HierarchyId-Datentyp ins Spiel. Mit ihm k&#246;nnen solche Zusammenh&#228;nge dargestellt und einfach abgefragt werden. Als Besonderheit gilt es zu beachten, dass dieser Datentyp als CLR-Datentyp implementiert ist, der allerdings auch dann zur Verf&#252;gung steht, wenn CLR-Integration deaktiviert ist. Daraus resultierend leitet sich auch die Darstellung der Funktionen ab. Dazu aber sp&#228;ter mehr. Zun&#228;chst m&#246;chte ich die oben gezeigte Struktur mit diesem Datentyp aufbauen. Dazu erstelle ich eine neue Tabelle.</p>
<p><img class="alignnone size-full wp-image-752" src="http://www.communardo.de/home/techblog/files/2008/12/namenlos2_1.jpg" alt="Erstellung der Tabelle" width="420" height="153" /></p>
<p>Im n&#228;chsten Schritt wird diese mit Daten gef&#252;llt.</p>
<p><img class="alignnone size-full wp-image-754" src="http://www.communardo.de/home/techblog/files/2008/12/namenlos31.jpg" alt="Daten einf&#252;gen" width="649" height="1222" /></p>
<p>L&#228;sst man sich nun die Daten einmal anzeigen, ergibt sich folgendes Bild:</p>
<p><img class="alignnone size-full wp-image-755" src="http://www.communardo.de/home/techblog/files/2008/12/namenlos4.jpg" alt="Gespeicherte Daten" width="495" height="343" /></p>
<p>Man erkennt, dass die Daten vorliegen &#8211; allerdings ist OrgNode eine hexadezimale  Darstellung, die nicht ganz so benutzerfreundlich ist. Daf&#252;r gibt es Abhilfe,  denn die Methode ToString gibt die kanonische Darstellung des OrgNodes  zur&#252;ck:</p>
<p><img class="alignnone size-full wp-image-756" src="http://www.communardo.de/home/techblog/files/2008/12/namenlos5.jpg" alt="GetString-Beispiel" width="482" height="368" /></p>
<p>Nun erkennt man die hierarchischen Beziehungen schon besser.</p>
<p>Um die Vorteile auch komplett ausnutzen zu k&#246;nnen, sollte man einen Blick auf die Methoden des HierarchyId-Datentyps werfen:</p>
<ul>
<li>GetRoot(): ermittelt den Hauptknoten</li>
<li>GetAncestor(n): ermittelt den n-ten Vaterknoten</li>
<li>GetDescendant(child1, child2): ermittelt Kindknoten</li>
<li>GetLevel(): ermittelt die Hierarchieebene</li>
<li>IsDescendantOf(): ermittelt, ob eine hierarchische Beziehung (ist y Kind von x) zwischen 2 Knoten besteht</li>
<li>ToString(): Konvertierung in die kanonische Form</li>
<li>Parse(): Konvertierung aus der kanonischen Form</li>
<li>GetReparentedValue(): n&#252;tzlich zum Umh&#228;ngen von Teilstrukturen</li>
</ul>
<p>Spalten des Datentyps HierarchyId achten nicht selbst auf die Eindeutigkeit. Aus diesem Grund ist es sinnvoll, einen eindeutigen Index auf die Spalte zu legen. Je nach Anwendungsfall unterscheidet man hier Depth-First-Index und Breadth-First-Index. Beim Depth-First-Index wird zuerst in die Tiefe gegangen &#8211; also zuerst alle Kindelemente des Knotens 1 indiziert, bevor zu Knoten 2 &#252;bergegangen wird. Beim Breadth-First-Index wird Ebene f&#252;r Ebene indiziert.</p>
<p>Das Anlegen eines Depth-First-Index ist recht trivial &#8211; dazu indiziert man  einfach eine bestehende HierarchyId-Spalte.</p>
<p><img class="alignnone size-full wp-image-757" src="http://www.communardo.de/home/techblog/files/2008/12/namenlos10.jpg" alt="Depth-First-Index" width="379" height="34" /></p>
<p>F&#252;r die Anlage eines Breadth-First-Indexes ben&#246;tigt man noch eine zus&#228;tzliche  Spalte in der Tabelle, in der der Level persistiert und die dann in den Index  mit einbezogen wird.</p>
<p><img class="alignnone size-full wp-image-758" src="http://www.communardo.de/home/techblog/files/2008/12/namenlos11.jpg" alt="Breadth-First-Index" width="492" height="89" /></p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2008/12/26/neuerungen-in-sql-server-2008-der-hierarchyid-datentyp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neuerungen in SQL Server 2008: FILESTREAM Storage</title>
		<link>http://www.communardo.de/home/techblog/2008/12/25/neuerungen-in-sql-server-2008-filestream-storage/</link>
		<comments>http://www.communardo.de/home/techblog/2008/12/25/neuerungen-in-sql-server-2008-filestream-storage/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 11:00:29 +0000</pubDate>
		<dc:creator>Dorrit Riemenschneider</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[FileStream Storage]]></category>
		<category><![CDATA[SQL2008]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=731</guid>
		<description><![CDATA[<img alt="dri" src="http://www.gravatar.com/avatar.php/787c944feb23a1f3f8e2bd4d150fa67d/?s=76" class="com-blog-icon"/><a href="http://www.communardo.de/home/techblog/author/dri/" title="Artikel von Dorrit Riemenschneider">Dorrit Riemenschneider</a><p>Gro&#223;e BLOBs (Videos, Word-Dokumente etc.) konnte man in MS SQL Server bisher entweder in der Datenbank (langsam) oder im Filesystem (unsicher, keine Transaktionen) ablegen. FILESTREAM Storage vereint die Vorteile von beiden.</p>
<p>Das Konzept von FILESTREAM integriert das SQL ServerDatenbankmodul in ein NTFS-Dateisystem: BLOB-Daten vom Typ varbinary(max) werden im Dateisystem gespeichert. Dadurch greift nicht die f&#252;r varbinary(max) definierte Gr&#246;&#223;enbeschr&#228;nkung auf 2 GB, sondern die Gr&#246;&#223;e der Dateien ist lediglich durch den verf&#252;gbaren Speicherplatz auf dem Laufwerk begrenzt. Ansonsten k&#246;nnen FILESTREAM-Daten ganz normal mit Transact-SQL-Anweisungen abgefragt, eingef&#252;gt, ge&#228;ndert oder gel&#246;scht werden &#8211; das alles nat&#252;rlich wie gehabt incl. Transaktionen und Datenbanksicherheit (mittels Berechtigungen auf Tabellen- oder Spaltenebene &#8211; nur das SQL Server Dienstkonto erh&#228;lt Zugriff auf die Daten im Dateisystem). Desweiteren  k&#246;nnen alle Verwaltungsfunktionen genutzt werden, z.B. zum Sichern und Wiederherstellen.</p>
<p>Und wie geht das? </p>
<p><strong>Zuerst muss FILESTREAM Storage aktiviert werden. </strong></p>
<p>Dies kann man entweder bereits bei der Installation von SQL Server 2008 erledigt haben:</p>
<p><img class="alignnone size-full wp-image-739" src="http://www.communardo.de/home/techblog/files/2008/12/filestream0.jpeg" alt="Aktivieren von FILESTREAM bei SQL 2008 Installation" width="640" height="480" /></p>
<p>&#8230; oder man muss es nachtr&#228;glich im SQL Server Configuration Manager tun:</p>
<ul>
<li>-&gt; Start -&gt; Programme -&gt; SQL Server 2008 -&gt; Konfigurationstools -&gt; SQL Server Configuration Manager</li>
<li>zur gew&#252;nschten SQL Server Instanz navigieren -&gt; Eigenschaftsdialog &#246;ffnen</li>
<li>Registerkarte FILESTREAM-&gt; Checkboxen &#8220;FILESTREAM f&#252;r Transact-SQL-Zugriff aktivieren&#8221; und &#8220;FILESTREAM f&#252;r E/A-Streamingzugriff auf Datei aktivieren&#8221; aktivieren und einen Freigabenamen f&#252;r den Datei-Speicherort eingeben</li>
<li>Wenn Remote Clients auf die FILESTREAM-Daten zugreifen sollen, dann auch die Checkbox &#8220;Streamingzugriff von Remoteclients auf FILESTREAM-Daten zulassen&#8221; aktivieren</li>
</ul>
<p><img class="alignnone size-full wp-image-740" src="http://www.communardo.de/home/techblog/files/2008/12/filestream1.png" alt="Aktivieren von FILESTREAM im SQL Configuration Manager" width="404" height="290" /></p>
<ul>
<li>Im SQL Management Studio muss zus&#228;tzlich folgende Abfrage ausgef&#252;hrt werden, um FILESTREAM f&#252;r Transact-SQL und f&#252;r den Win32-Streamingzugriff zu aktivieren:EXEC sp_configure filestream_access_level, 2<br />
RECONFIGURE</li>
</ul>
<p><strong>Dann kann eine FILESTREAM-aktivierte Datenbank erstellt werden:</strong></p>
<p>CREATE DATABASE Test<br />
ON<br />
PRIMARY ( NAME = test1,<br />
FILENAME = &#8216;c:\data\testdat1.mdf&#8217;),<br />
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM( NAME = test3,<br />
FILENAME = &#8216;c:\data\filestream1&#8242;)<br />
LOG ON  ( NAME = testlog1,<br />
FILENAME = &#8216;c:\data\testlog1.ldf&#8217;)<br />
GO</p>
<p>Wenn FILESTREAM nachtr&#228;glich f&#252;r eine bereits vorhandene Datenbank aktiviert werden soll, m&#252;ssen folgende Abfragen ausgef&#252;hrt werden:</p>
<p>ALTER DATABASE Test ADD<br />
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM;<br />
GO</p>
<p>ALTER DATABASE Test ADD FILE (<br />
NAME = FSGroup1File,<br />
FILENAME = &#8216;c:\data\filestream1&#8242;)<br />
TO FILEGROUP FileStreamGroup1;<br />
GO</p>
<p>Achtung!<br />
Das Verzeichnis &#8220;filestream1&#8243; darf noch nicht vorhanden sein, es wird automatisch angelegt und ist erst einmal leer bis auf die Datei filestream.hdr und den Ordner $FSLOG.</p>
<p><strong>Zu guter Letzt muss eine Tabelle zum Speichern von FILESTREAM-Daten erstellt werden:</strong></p>
<p>CREATE TABLE Test.dbo.Documents (<br />
DocumentID INT IDENTITY PRIMARY KEY,<br />
Document VARBINARY (MAX) FILESTREAM NULL,<br />
DocumentGuid UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE)<br />
FILESTREAM_ON FileStreamGroup1;<br />
GO</p>
<p>Eine Spalte mit FILESTREAM-Daten ist eine varbinary(max)-Spalte mit FILESTREAM-Attribut. Eine ROWGUIDCOL-Spalte ist nur f&#252;r die Verwendung von FILESTREAM-Daten mit Win32-APIs erforderlich.</p>
<p><strong>Nun k&#246;nnen nach Belieben mit Transact SQL Daten eingef&#252;gt, abgefragt etc. werden:</strong></p>
<p>INSERT INTO Test.dbo.Documents<br />
VALUES (1, newid (), CAST (&#8216;Das ist ein Test&#8217; as varbinary(max)));<br />
GO</p>
<p>UPDATE Test.dbo.Documents<br />
SET Document = CAST (&#8216;Das ist noch ein Test&#8217; as varbinary(max)))<br />
WHERE DocumentID = 1;<br />
GO</p>
<p>DELETE Test.dbo.Documents WHERE DocumentID = 1;<br />
GO</p>
<p>Anmerkung:<br />
Das &#196;ndern gro&#223;er Datenmengen ist mit Transact SQL zwar m&#246;glich, aber  nicht empfehlenswert. Zum Schreiben gro&#223;er Datenmengen verwendet man besser die Win32-API (aber das ist eine andere Geschichte, die soll ein andermal erz&#228;hlt werden&#8230;)</p>
<p><strong>Zum Abschluss noch einige &#220;berlegungen zum Einsatz von FILESTREAM:</strong></p>
<ul>
<li>FILESTREAM-Speicherung is sinnvoll bei Objekten, die im Schnitt gr&#246;&#223;er als 1 MB sind.</li>
<li>FILESTREAM-Speicherung is sinnvoll, wenn schneller Lesezugriff wichtiger ist als schneller Schreibzugriff.</li>
<li>FILESTREAM-Daten werden nicht verschl&#252;sselt (auch dann nicht, wenn die transparente Datenverschl&#252;sselung aktiviert ist).</li>
</ul>
]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2008/12/25/neuerungen-in-sql-server-2008-filestream-storage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neuerungen in SQL Server 2008: Sparse Columns</title>
		<link>http://www.communardo.de/home/techblog/2008/12/21/neuerungen-in-sql-server-2008-sparse-columns/</link>
		<comments>http://www.communardo.de/home/techblog/2008/12/21/neuerungen-in-sql-server-2008-sparse-columns/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 15:09:06 +0000</pubDate>
		<dc:creator>Dorrit Riemenschneider</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[Sparse Columns]]></category>
		<category><![CDATA[SQL2008]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=702</guid>
		<description><![CDATA[<img alt="dri" src="http://www.gravatar.com/avatar.php/787c944feb23a1f3f8e2bd4d150fa67d/?s=76" class="com-blog-icon"/><a href="http://www.communardo.de/home/techblog/author/dri/" title="Artikel von Dorrit Riemenschneider">Dorrit Riemenschneider</a><p>Um gleich mal zu Beginn &#252;bertriebene Erwartungen zu d&#228;mpfen (und eventuellen Normalform-Fetischisten den Wind aus den Segeln zu nehmen): in 99% aller F&#228;lle sind Sparse Columns NICHT unbedingt erforderlich.</p>
<p>SQL Server 2008 kann jetzt bis zu 16.384 Spalten in einer Tabelle speichern (zum Vergleich: bisher waren maximal 1024 Spalten in einer Tabelle m&#246;glich). Nun fragt man sich angesichts solcher Gr&#246;&#223;enordnungen schon: &#8220;Wann, um alles in der Welt, ben&#246;tige ich in einer relationalen Datenbank eine solche Menge an Spalten?&#8221;</p>
<p>Hier mal ein Beispiel-Szenario: Wir designen gerade eine Tabelle f&#252;r Getr&#228;nke und haben jede Menge an Attributen zu speichern, die nur bei einzelnen Getr&#228;nke-Kategorien zutreffen: bei alkoholischen Getr&#228;nken im Allgemeinen den Alkoholgehalt, bei Wein im Speziellen die Farbe, den S&#252;&#223;egrad, die Rebsorte, das Anbaugebiet, &#8230; (Weinkennern f&#228;llt bestimmt noch einiges ein), bei Saft die Obstsorte und den Fruchtgehalt, bei Milch den Fettgehalt und ob Frisch- oder H-Milch etc. pp.</p>
<p>Nun wird der eingefleischte Datenbank-Designer feststellen, dass man das alles mit Hilfe von separaten Tabellen f&#252;r jede Getr&#228;nkekategorie und 1:1-Verkn&#252;pfungen doch h&#252;bsch sauber in einer relationalen Struktur abbilden kann, ohne eine Unmenge an Spalten zu ben&#246;tigen. Sicher &#8211; kann man. Aber Hand aufs Herz:  manchmal schie&#223;t man damit einfach &#252;ber das Ziel hinaus und erschwert sich unn&#246;tig das Leben durch die daraus resultierenden komplexen Abfragen.</p>
<p>Und hier setzen nun Sparse Columns (&#8220;sp&#228;rlich belegte Spalten&#8221;) an: <strong>In SQL Server 2008 kann man Spalten mit dem Attribut SPARSE versehen, dann verbrauchen sie, wenn sie leer bleiben, auch keinen Platz.</strong></p>
<div id="attachment_718" class="wp-caption alignnone" style="width: 510px"><a href="http://www.communardo.de/home/techblog/files/2008/12/sparse.jpg"><img class="size-full wp-image-718" src="http://www.communardo.de/home/techblog/files/2008/12/sparse.jpg" alt="Tabelle mit SPARSE-Spalten" width="500" height="208" /></a><p class="wp-caption-text">Tabelle mit SPARSE-Spalten</p></div>
<p>Ob man die so erlaubten 16.384 Spalten tats&#228;chlich einmal erreicht, sei dahingestellt &#8211; dieses Konzept lohnt sich aus Sicht der Speicherplatzersparnis auch mit wenigen Spalten, wenn man in einer Tabelle viele Zeilen hat, f&#252;r die bestimmte Spalten sehr selten belegt sind.</p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2008/12/21/neuerungen-in-sql-server-2008-sparse-columns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neuerungen in SQL Server 2008: Table Valued Parameters (TVP)</title>
		<link>http://www.communardo.de/home/techblog/2008/11/21/neuerungen-in-sql-server-2008-table-valued-parameters-tvp/</link>
		<comments>http://www.communardo.de/home/techblog/2008/11/21/neuerungen-in-sql-server-2008-table-valued-parameters-tvp/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 19:28:18 +0000</pubDate>
		<dc:creator>Dorrit Riemenschneider</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[ADO.Net]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL2008]]></category>
		<category><![CDATA[TVP]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=549</guid>
		<description><![CDATA[<img alt="dri" src="http://www.gravatar.com/avatar.php/787c944feb23a1f3f8e2bd4d150fa67d/?s=76" class="com-blog-icon"/><a href="http://www.communardo.de/home/techblog/author/dri/" title="Artikel von Dorrit Riemenschneider">Dorrit Riemenschneider</a><p><strong>&#8230; oder wie bei Microsoft das Basteln abgeschafft wurde</strong><br />
Wer schon einmal vor dem Problem stand, an eine SQL Server Prozedur oder Funktion eine Liste von Werten oder gar eine Tabelle zu &#252;bergeben, der wird f&#252;r dieses Problem  bestimmt eine L&#246;sung gefunden haben: Ob man nun die Werte mit einem geeigneten Trennzeichen versehen (ich bevorzuge Pipes <span><img class="wp-smiley" src="../wp-includes/images/smilies/icon_wink.gif" alt=";-)" /></span>) alle in eine varchar(max)-Variable packt und mittels einer benutzerdefinierten Funktion wieder &#8220;auseinanderschnipselt&#8221; oder gleich den XML-Datentyp verwendet -<span> es gibt die verschiedensten Bastell&#246;sungsans&#228;tze, dieser Problematik Herr zu werden. </span></p>
<p>SQL Server 2008 offeriert mit Table Valued Parameters diese Funktionalit&#228;t nun g&#228;nzlich ohne Bastelei. Die Technik daf&#252;r ist denkbar simpel:</p>
<p>Es wird angenommen, dass eine Tabelle Employees mit folgender Struktur existiert:<br />
<a href="http://www.communardo.de/home/techblog/files/2008/11/table.jpg"><img class="alignnone size-full wp-image-563" src="http://www.communardo.de/home/techblog/files/2008/11/table.jpg" alt="" width="274" height="69" /></a></p>
<p>Nun muss man</p>
<ol>
<li>einen benutzerdefinierter Datentyp vom Typ Table erzeugen:<br />
<a href="http://www.communardo.de/home/techblog/files/2008/11/type.jpg"><img class="alignnone size-full wp-image-556" src="http://www.communardo.de/home/techblog/files/2008/11/type.jpg" alt="" width="646" height="18" /></a><a href="http://www.communardo.de/home/techblog/files/2008/11/type.jpg"></a></li>
<li>eine SQL Server Prozedur oder Funktion erstellen, die den neuen Typ als Input-Parameter verwendet:<br />
<a href="http://www.communardo.de/home/techblog/files/2008/11/proc1.jpg"><img class="alignnone size-full wp-image-560" src="http://www.communardo.de/home/techblog/files/2008/11/proc1.jpg" alt="" width="422" height="99" /></a><a href="http://www.communardo.de/home/techblog/files/2008/11/proc.jpg"></a></li>
<li>eine Variable von diesem Typ erzeugen und mit Daten bef&#252;llen:<br />
<a href="http://www.communardo.de/home/techblog/files/2008/11/decclare.jpg"><img class="alignnone size-full wp-image-561" src="http://www.communardo.de/home/techblog/files/2008/11/decclare.jpg" alt="" width="603" height="50" /></a></li>
<li>die Variable an die Prozedur oder Funktion &#252;bergeben:<br />
<a href="http://www.communardo.de/home/techblog/files/2008/11/exec.jpg"><img class="alignnone size-full wp-image-562" src="http://www.communardo.de/home/techblog/files/2008/11/exec.jpg" alt="" width="241" height="21" /></a></li>
</ol>
<p>Fertig <span><img class="wp-smiley" src="../wp-includes/images/smilies/icon_wink.gif" alt=";-)" /></span></p>
<p>F&#252;r alle, die es gerne schnell mal ausprobieren m&#246;chten, hier nochmal zum Kopieren:</p>
<p><em>CREATE TABLE Employees(<br />
EmployeeID int NOT NULL,<br />
LastName nvarchar(50) NOT NULL,<br />
FirstName nvarchar(50) NOT NULL)<br />
go</em></p>
<p><em>CREATE TYPE T_Employees AS TABLE (EmployeeID int, LastName nvarchar(50), FirstName nvarchar(50))<br />
go</em></p>
<p><em>CREATE PROCEDURE P_InsertEmployees<br />
@employees T_Employees READONLY<br />
AS<br />
INSERT INTO Employees (EmployeeID, LastName, FirstName)<br />
SELECT EmployeeID, LastName, FirstName<br />
FROM @employees<br />
go</em></p>
<p><em>DECLARE @emps T_Employees<br />
INSERT INTO @emps (EmployeeID, LastName, FirstName) VALUES (1, &#8216;Davolio&#8217;, &#8216;Nancy&#8217;)<br />
INSERT INTO @emps (EmployeeID, LastName, FirstName) VALUES (2, &#8216;Fuller&#8217;, &#8216;Andrew&#8217;)</em></p>
<p><em>EXEC P_InsertEmployees @emps</em></p>
<p>Hier noch ein paar Dinge, die zu beachten bzw. wissenswert sind:</p>
<ul>
<li>Der INPUT-Parameter f&#252;r die Prozedur muss READONLY sein.</li>
<li>TVP k&#246;nnen nicht als Return-Variable f&#252;r eine Funktion verwendet werden.</li>
<li>Microsoft empfielt die Verwendung von TVP bis zur Anzahl von 1000 Datens&#228;tzen, f&#252;r alles, was dr&#252;ber ist, sollte BULK INSERT verwendet werden.</li>
<li>TVP werden als tempor&#228;re Tabellen in der tempdb gespeichert.</li>
</ul>
<p>Und zum Abschluss noch ein kleiner Leckerbissen f&#252;r ADO.Net Programmierer: TVP werden auch hier vollst&#228;ndig unterst&#252;tzt, ein Beispiel f&#252;r den Aufruf der oben erstellte Prozedur in C# k&#246;nnte so aussehen:</p>
<p><em>SqlConnection sqlConn&#8230;<br />
DataTable dt = new DataTable();<br />
dt.Columns.Add&#8230;.<br />
dt.Rows.Add&#8230;..<br />
SqlCommand cmd = new SqlCommand(&#8220;P_InsertEmployees&#8221;, sqlConn);<br />
cmd.Parameters.AddWithValue(&#8220;@employees&#8221;, dt);<br />
cmd.ExecuteNonQuery();</em></p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2008/11/21/neuerungen-in-sql-server-2008-table-valued-parameters-tvp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neuerungen in SQL Server 2008: MERGE-Anweisung</title>
		<link>http://www.communardo.de/home/techblog/2008/11/16/neuerungen-in-sql-server-2008-merge-anweisung/</link>
		<comments>http://www.communardo.de/home/techblog/2008/11/16/neuerungen-in-sql-server-2008-merge-anweisung/#comments</comments>
		<pubDate>Sun, 16 Nov 2008 10:33:46 +0000</pubDate>
		<dc:creator>Dorrit Riemenschneider</dc:creator>
				<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[MERGE]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL2008]]></category>

		<guid isPermaLink="false">http://www.communardo.de/techblog/?p=528</guid>
		<description><![CDATA[<img alt="dri" src="http://www.gravatar.com/avatar.php/787c944feb23a1f3f8e2bd4d150fa67d/?s=76" class="com-blog-icon"/><a href="http://www.communardo.de/home/techblog/author/dri/" title="Artikel von Dorrit Riemenschneider">Dorrit Riemenschneider</a><p class="MsoNormal"><span style="#444444">Wer sich schon immer mal dar&#252;ber ge&#228;rgert hat, dass mehrere SQL-Anweisungen n&#246;tig waren, um in einer Tabelle, abh&#228;ngig von den Bedingungen in einer anderen Tabelle, Daten einzuf&#252;gen, zu &#228;ndern und/oder zu l&#246;schen, der wird &#252;ber die neue MERGE-Anweisung in SQL Server 2008 hocherfreut sein &#8211; &#8230; vorausgesetzt, er kann sich f&#252;r komplexe SQL-Anweisungen begeistern <img src='http://www.communardo.de/home/techblog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  . </span></p>
<p class="MsoNormal"><span style="#444444">Das absolute Standard-Szenario f&#252;r die Anwendung von MERGE ist die Aktualisierung von Daten in einem Data Warehouse auf Basis der Daten aus dem Produktivsystem: Im Data Warehouse sollen </span></p>
<ul>
<li><!--[if !supportLists]--><span style="#444444">Adressdaten, die im Produktivsystem vorhanden sind, aber nicht im Data Warehouse, eingef&#252;gt werden (INSERT)</span></li>
<li><!--[if !supportLists]--><span style="#444444"><span><span> </span></span></span><!--[endif]--><span style="#444444">Adressdaten, die im Produktivsystem und im Data Warehouse vorhanden sind, ge&#228;ndert werden (UPDATE)</span></li>
<li><!--[if !supportLists]--><span style="#444444"><span><span> </span></span></span><!--[endif]--><span style="#444444">Adressdaten, die im Data Warehouse, nicht aber im Produktivsystem vorhanden sind, gel&#246;scht werden (DELETE)</span></li>
</ul>
<p class="MsoNormal"><span style="#444444">Daf&#252;r waren bisher 3 Anweisungen der folgenden Art n&#246;tig (je eine f&#252;r INSERT, UPDATE und DELETE):</span></p>
<p class="MsoNormal"><img src="/Users/dri/AppData/Local/Temp/moz-screenshot-4.jpg" alt="" /><a href="http://www.communardo.de/home/techblog/files/2008/10/bild12.jpg"><img class="alignnone" src="http://www.communardo.de/home/techblog/files/2008/10/bild12.jpg" alt="" width="615" height="149" /></a></p>
<p class="MsoNormal"><span style="#444444">Mit dem MERGE-Befehl nun ist das alles in einer Anweisung unterzubringen:</span></p>
<p><a href="http://www.communardo.de/home/techblog/files/2008/10/bild2.jpg"><img class="alignleft" src="http://www.communardo.de/home/techblog/files/2008/10/bild2.jpg" alt="" width="784" height="120" /></a></p>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal"><span style="#444444">Das kommt nicht nur deutlich eleganter daher, sondern ist auch ressourcensparend, da nur eine anstelle mehrerer Lookup-Operationen durchgef&#252;hrt wird.</span></p>
<p class="MsoNormal"><span style="#444444">Wichtig: Die MERGE-Anweisung muss immer mit einem Semikolon abgeschlossen werden.</span></p>
<p class="MsoNormal"><span style="#444444">Nat&#252;rlich ist die MERGE-Anweisung noch deutlich flexibler als hier abgebildete Variante, z.B. kann die USING-Klausel auch eine Unterabfrage (dann mit einem Alias) enthalten oder die MATCHED-Klausel beliebig mit weiteren logischen Ausr&#252;cken kombiniert werden,  des Weiteren sind beliebig viele MATCHED-Klauseln von jeder Art m&#246;glich. Ein etwas komplexeres Beispiel k&#246;nnte z.B. so aussehen:</span></p>
<p><a href="http://www.communardo.de/home/techblog/files/2008/10/bild3.jpg"><img class="alignleft" src="http://www.communardo.de/home/techblog/files/2008/10/bild3.jpg" alt="" width="778" height="143" /></a></p>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal"><span style="#444444">Ausf&#252;hrliche Syntaxinformationen finden sich unter <a title="http://msdn.microsoft.com/de-de/library/bb510625.aspx" href="http://msdn.microsoft.com/de-de/library/bb510625.aspx"><span style="none">http://msdn.microsoft.com/de-de/library/bb510625.aspx</span></a>.</span></p>
]]></description>
		<wfw:commentRss>http://www.communardo.de/home/techblog/2008/11/16/neuerungen-in-sql-server-2008-merge-anweisung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
