<?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>Codehauerei Schwarz &#187; SQL Server</title>
	<atom:link href="http://codehauerei-schwarz.de/category/sql-server/feed/" rel="self" type="application/rss+xml" />
	<link>http://codehauerei-schwarz.de</link>
	<description>.NET SQL-Server &#38; more</description>
	<lastBuildDate>Mon, 21 Jun 2010 18:34:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>SqlParameter.Add() vs AddWithValue()</title>
		<link>http://codehauerei-schwarz.de/2010/06/21/sqlparameter-add-vs-addwithvalue/</link>
		<comments>http://codehauerei-schwarz.de/2010/06/21/sqlparameter-add-vs-addwithvalue/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 18:33:05 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=209</guid>
		<description><![CDATA[Der Großteil der Entwickler wird sich bei Datenbankabfragen sicher mit der Methode AddWithValue() angefreundet haben. Man gibt nur noch den Namen des Sql-Parameters und den entsprechenden Wert an und das .Net Framework kümmert sich um den Rest. using (var conn = new SqlConnection(@"ConnectionString zensiert")) { conn.Open();      string sql = "Select LastName FROM TestTable WHERE [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2010/06/SqlParameter_AddWithValue_3.png"></a>Der Großteil der Entwickler wird sich bei Datenbankabfragen sicher mit der Methode AddWithValue() angefreundet haben.</p>
<p>Man gibt nur noch den Namen des Sql-Parameters und den entsprechenden Wert an und das .Net Framework kümmert sich um den Rest.</p>
<pre class="brush:[c#]">using (var conn = new SqlConnection(@"ConnectionString zensiert"))
{
     conn.Open();

     string sql = "Select LastName FROM TestTable WHERE LastName = @l";

     var cmd = new SqlCommand(sql, conn);

      cmd.Parameters.AddWithValue("@l", "Harglgargl");
       //selbes Ergebnis
       //cmd.Parameters.Add("@l", "Meier");

       object res = cmd.ExecuteScalar();
}</pre>
<p>Ich würde erwarten, dass der SQL-Server schlau genug wäre und den Parameter korrekt auflöst.</p>
<p>Leider gibt es hier ein kleines Problem.</p>
<p>Führt man das Codefragment mit den Werten &#8220;Huber&#8221;, &#8220;Schmidt&#8221;, und &#8220;Harglgargl&#8221; aus würde man erwarten,</p>
<p>dass der SQL-Server einen bereits vorhandenen Ausführungsplan benutzt bzw. einen Plan für diese Abfrage erstellt und dann wiederverwendet.</p>
<p>Das Resultat sieht leider etwas anders aus:</p>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2010/06/SqlParameter_AddWithValue_1.png"><img class="alignnone size-full wp-image-213" title="SqlParameter_AddWithValue_1" src="http://codehauerei-schwarz.de/wp-content/uploads/2010/06/SqlParameter_AddWithValue_1.png" alt="Cached Plans" width="573" height="306" /></a></p>
<p>Für jede Varchar-Länge wird ein eigener Ausführungsplan angelegt.</p>
<p>Die Auswirkungen werden bei einem genaueren Blick auf die Speicherausnutzung des SQL-Servers deutlich.</p>
<p>Mein Dev-Server sagt dazu auf jeden Fall Folgendes:</p>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2010/06/SqlParameter_AddWithValue_2.png"><img class="alignnone size-full wp-image-215" title="SqlParameter_AddWithValue_2" src="http://codehauerei-schwarz.de/wp-content/uploads/2010/06/SqlParameter_AddWithValue_2.png" alt="" width="182" height="76" /></a></p>
<p>Cached: verwendeter Speicher um Seiten zu cachen</p>
<p>Stolen: Speicher der &#8220;gestohlen&#8221; wird um Ausführungspläne zu cachen</p>
<p>Das Verhältnis wird in den meisten Szenarien vernachlässigbar sein. Ich kann mir allerdings einige Umgebungen vorstellen in denen das Ganze zum Problem werden könnte.</p>
<p>Wie dem auch sei. Je mehr Speicher zur Verfügung steht um Seiten zu cachen umso besser <img src='http://codehauerei-schwarz.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Die Lösung des Ganzen ist aktuell leider etwas umständlich. Man kann das Ganze umgehen indem man den Datentyp der entsprechenden Datenbankspalte angibt.</p>
<p>Leider ist das Ganze extrem lästig da es aktuell keine brauchbare Überladung gibt (Man kann sich natürlich eine schnitzen)&#8230;</p>
<pre class="brush:[c#]">using (var conn = new SqlConnection(@"ConnectionString zensiert"))
{
     conn.Open();

     string sql = "Select LastName FROM TestTable WHERE LastName = @l";

     var cmd = new SqlCommand(sql, conn);

     SqlParameter p = new SqlParameter("@l", System.Data.SqlDbType.VarChar, 1000);
     p.Value = "Huber";

     cmd.Parameters.Add(p);

     object res = cmd.ExecuteScalar();
}</pre>
<p> </p>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2010/06/SqlParameter_AddWithValue_3.png"><img class="alignnone size-full wp-image-218" title="SqlParameter_AddWithValue_3" src="http://codehauerei-schwarz.de/wp-content/uploads/2010/06/SqlParameter_AddWithValue_3.png" alt="" width="522" height="58" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2010/06/21/sqlparameter-add-vs-addwithvalue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hierarchische Gruppierungen mit Rank()</title>
		<link>http://codehauerei-schwarz.de/2010/05/23/hierarchische-gruppierungen-mit-rank/</link>
		<comments>http://codehauerei-schwarz.de/2010/05/23/hierarchische-gruppierungen-mit-rank/#comments</comments>
		<pubDate>Sun, 23 May 2010 14:16:49 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=184</guid>
		<description><![CDATA[Wie ermittelt man die Torschützenkönige der Bundesliga aus einer Liste aller Torschützen der jeweiligen Saison ? Das Ganze wäre prinzipiell mit Hilfe einiger Subqueries machbar. Optimaler läßt sich das Ganze mit Hilfe der Funktion Rank() lösen die ab SQL-Server 2005 zur Verfügung steht. SELECT Spieler, Verein, Tore, Saison, RANK() OVER (PARTITION BY Saison ORDER BY [...]]]></description>
			<content:encoded><![CDATA[<p>Wie ermittelt man die Torschützenkönige der Bundesliga aus einer Liste aller Torschützen der jeweiligen Saison ?</p>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2010/05/Liste_Torschuetzen.png"><img class="alignnone size-full wp-image-185" title="Liste_Torschuetzen" src="http://codehauerei-schwarz.de/wp-content/uploads/2010/05/Liste_Torschuetzen.png" alt="" width="342" height="186" /></a></p>
<p>Das Ganze wäre prinzipiell mit Hilfe einiger Subqueries machbar.</p>
<p>Optimaler läßt sich das Ganze mit Hilfe der Funktion Rank() lösen die ab SQL-Server 2005 zur Verfügung steht.</p>
<pre class="brush:[sql]">SELECT
	Spieler,
	Verein,
	Tore,
	Saison,
	RANK() OVER (PARTITION BY Saison ORDER BY Tore DESC) AS Platz
FROM
	#ErzielteTreffer</pre>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2010/05/Liste_RankingProSaison.png"><img class="alignnone size-full wp-image-186" title="Liste_RankingProSaison" src="http://codehauerei-schwarz.de/wp-content/uploads/2010/05/Liste_RankingProSaison.png" alt="" width="380" height="187" /></a></p>
<pre class="brush:[sql]">SELECT Spieler,Verein,Tore,Saison FROM
	(
	SELECT
		Spieler,
		Verein,
		Tore,
		Saison,
		RANK() OVER (PARTITION BY Saison ORDER BY Tore DESC) AS Platz
	FROM
	#ErzielteTreffer
	) AS Rangfolge
WHERE Platz = 1</pre>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2010/05/Liste_RankingErgebnis.png"><img class="alignnone size-full wp-image-188" title="Liste_RankingErgebnis" src="http://codehauerei-schwarz.de/wp-content/uploads/2010/05/Liste_RankingErgebnis.png" alt="" width="301" height="76" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2010/05/23/hierarchische-gruppierungen-mit-rank/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excel Dateien mit SQL auswerten</title>
		<link>http://codehauerei-schwarz.de/2009/11/11/excel-dateien-mit-sql-auswerten/</link>
		<comments>http://codehauerei-schwarz.de/2009/11/11/excel-dateien-mit-sql-auswerten/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 09:10:52 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[OPENDATASOURCE]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=125</guid>
		<description><![CDATA[Excel Query Excel 97 &#8211; 2003 SELECT      [ID], -- Excel Spalte 1      [Text] -- Excel Spalte 2 FROM      OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',      'Data Source=C:\test.xls;Extended Properties=Excel 8.0')      ...[Tabelle1$] -- Tabellenblatt ORDER BY [ID] DESC Excel 2007: Um die Funktionalität auch bei .xslx-Dateien nutzen zu können, muß folgende Komponente auf dem System installiert sein: 2007 Office [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/Excel-Query.rar">Excel Query</a></p>
<p><strong>Excel 97 &#8211; 2003</strong></p>
<pre class="brush:[sql]">SELECT

     [ID], -- Excel Spalte 1
     [Text] -- Excel Spalte 2

FROM

     OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
     'Data Source=C:\test.xls;Extended Properties=Excel 8.0')
     ...[Tabelle1$] -- Tabellenblatt

ORDER BY

[ID] DESC</pre>
<p><strong>Excel 2007:</strong></p>
<p>Um die Funktionalität auch bei .xslx-Dateien nutzen zu können, muß folgende Komponente auf dem System installiert sein:<br />
<a href="http://www.microsoft.com/downloads/details.aspx?familyid=7554F536-8C28-4598-9B72-EF94E038C891&amp;displaylang=en">2007 Office System Driver: Data Connectivity Components</a><br />
 </p>
<pre class="brush:[sql]">SELECT
	*
FROM
	OPENDATASOURCE(
		'Microsoft.ACE.OLEDB.12.0',
		'Data Source=C:\test.xlsx;Extended Properties=Excel 12.0')
		...[Tabelle1$]</pre>
<p>Leider funktioniert das Ganze aktuell nur auf 32-Bit Systemen, da die entsprechenden Provider auf 64-Bit Systemen derzeit nicht zur Verfügung gestellt werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/11/11/excel-dateien-mit-sql-auswerten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>X-Server SQL Query Template mit OPENROWSET</title>
		<link>http://codehauerei-schwarz.de/2009/11/04/x-server-sql-query-template-mit-openrowset/</link>
		<comments>http://codehauerei-schwarz.de/2009/11/04/x-server-sql-query-template-mit-openrowset/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 14:38:40 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[OPENROWSET]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=113</guid>
		<description><![CDATA[SELECT * FROM OPENROWSET ('MSDASQL', 'DRIVER={SQL Server};SERVER=zensiert;UID=zensiert;PWD=zensiert, Testdatenbank.Schema.TestTabelle) WHERE ... Um dieses Feature nutzen zu können muss folgendes Setting aktiviert sein EXEC sp_configure 'Ad Hoc Distributed Queries', '1' RECONFIGURE http://technet.microsoft.com/de-de/library/ms187569.aspx]]></description>
			<content:encoded><![CDATA[<pre class="brush:[sql]">SELECT * FROM OPENROWSET
      ('MSDASQL', 'DRIVER={SQL Server};SERVER=zensiert;UID=zensiert;PWD=zensiert,
      Testdatenbank.Schema.TestTabelle) 

      WHERE ...</pre>
<p>Um dieses Feature nutzen zu können muss folgendes Setting aktiviert sein</p>
<pre class="brush:[sql]">EXEC sp_configure 'Ad Hoc Distributed Queries', '1' RECONFIGURE</pre>
<p>http://technet.microsoft.com/de-de/library/ms187569.aspx</p>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/11/04/x-server-sql-query-template-mit-openrowset/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Cursor Template</title>
		<link>http://codehauerei-schwarz.de/2009/11/04/sql-cursor-template/</link>
		<comments>http://codehauerei-schwarz.de/2009/11/04/sql-cursor-template/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 14:14:41 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Cursor]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=109</guid>
		<description><![CDATA[DECLARE @lastname varchar(100) DECLARE @firstname varchar(100) DECLARE query_cursor CURSOR FOR SELECT LastName, FirstName FROM T_AddressData ORDER BY PK_AddressData OPEN query_cursor FETCH NEXT FROM query_cursor INTO @lastname, @firstname PRINT '---------- Results ----------' WHILE @@FETCH_STATUS = 0 BEGIN PRINT (@lastname + ' ' + @firstname) FETCH NEXT FROM query_cursor INTO @lastname, @firstname END CLOSE query_cursor DEALLOCATE query_cursor]]></description>
			<content:encoded><![CDATA[<pre class="brush:[sql]">DECLARE @lastname varchar(100)
DECLARE @firstname varchar(100)

DECLARE query_cursor CURSOR FOR

	SELECT
		LastName,
		FirstName
	FROM
		T_AddressData
	ORDER BY
		PK_AddressData

OPEN query_cursor

FETCH NEXT FROM query_cursor
INTO @lastname, @firstname

PRINT '---------- Results ----------'

WHILE @@FETCH_STATUS = 0
BEGIN
	PRINT (@lastname + ' ' + @firstname)

	FETCH NEXT FROM query_cursor
	INTO @lastname, @firstname
END

CLOSE query_cursor
DEALLOCATE query_cursor</pre>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/11/04/sql-cursor-template/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rekursive SQL Queries &#8211; Common Table Expression</title>
		<link>http://codehauerei-schwarz.de/2009/11/02/rekursive-sql-queries-common-table-expression/</link>
		<comments>http://codehauerei-schwarz.de/2009/11/02/rekursive-sql-queries-common-table-expression/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 16:03:24 +0000</pubDate>
		<dc:creator>Andreas Schwarz</dc:creator>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[CTE]]></category>
		<category><![CDATA[Rekursion]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://codehauerei-schwarz.de/?p=89</guid>
		<description><![CDATA[CTE Rekursion &#8211; Sample   WITH TEMP (Pk, Parent_Pk, Title, Name, Iteration) AS (   SELECT Pk_JobStruct, Fk_Parent, Title, Name, 0   FROM T_JobStruct   WHERE PK_JobStruct = 1 -- el cheffe  UNION ALL   SELECT sub.Pk_Jobstruct, sub.Fk_Parent, sub.Title, sub.Name, (t.Iteration + 1)   FROM T_JobStruct AS sub, temp AS t   WHERE t.Pk = sub.Fk_Parent ) SELECT * FROM Temp]]></description>
			<content:encoded><![CDATA[<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/CTE-Rekursion.txt">CTE Rekursion &#8211; Sample</a><br />
 <br />
<a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/rec_result.png"><img class="alignnone size-full wp-image-96" title="rec_result" src="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/rec_result.png" alt="rec_result" width="378" height="205" /></a></p>
<pre class="brush:[sql]">WITH TEMP (Pk, Parent_Pk, Title, Name, Iteration) AS
(
  SELECT Pk_JobStruct, Fk_Parent, Title, Name, 0
  FROM T_JobStruct
  WHERE PK_JobStruct = 1 -- el cheffe

 UNION ALL

  SELECT sub.Pk_Jobstruct, sub.Fk_Parent, sub.Title, sub.Name, (t.Iteration + 1)
  FROM T_JobStruct AS sub, temp AS t
  WHERE t.Pk = sub.Fk_Parent

)

SELECT * FROM Temp</pre>
<p><a href="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/rec_cte_queryresult.png"><img class="alignnone size-full wp-image-101" title="rec_cte_queryresult" src="http://codehauerei-schwarz.de/wp-content/uploads/2009/11/rec_cte_queryresult.png" alt="rec_cte_queryresult" width="359" height="197" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://codehauerei-schwarz.de/2009/11/02/rekursive-sql-queries-common-table-expression/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
