<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Benjamin Guinebertière : SQL Server 2005</title><link>http://blogs.msdn.com/benjguin/archive/tags/SQL+Server+2005/default.aspx</link><description>Tags: SQL Server 2005</description><dc:language>fr-FR</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Should I deploy my C# code to a SQL Server 2005 stored procedure?</title><link>http://blogs.msdn.com/benjguin/archive/2006/04/04/568506.aspx</link><pubDate>Wed, 05 Apr 2006 01:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:568506</guid><dc:creator>benjguin</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/benjguin/comments/568506.aspx</comments><wfw:commentRss>http://blogs.msdn.com/benjguin/commentrss.aspx?PostID=568506</wfw:commentRss><description>&lt;P&gt;I think one of the criteria is: Will this make SQL Server cluster consume less&amp;nbsp;resources (CPU, Memory, Network bandwith, ...)&amp;nbsp;to have the C# code inside the database or outside the database?&lt;/P&gt;
&lt;P&gt;The reason is that in a typical Web infrastructure where you have a SQL cluster that does not scale out as easily as the other servers (like web servers in the farm), the SQL cluster is the most precious part of the infrastructure.&lt;/P&gt;
&lt;P&gt;In a scenario where you have data set operations, like calculating a surface with points stored in the DB, having C# code inside the database is better, because it will cost less to the SQL Server to process calculation inside the DB and not have the whole data transmitted to the Web or calculation Servers.&lt;BR&gt;On the other hand, if you need to do expensive calculations on few data, please do it outside the database.&lt;/P&gt;
&lt;P&gt;Another criterion is to avoid having SQL Server connect elsewhere. Typical architectures have most servers connect to SQL Server and SQL Server connect to nearly nothing (just an SMTP server, and maybe some external OLE DB data sources).&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=568506" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/benjguin/archive/tags/Web+Infrastructure/default.aspx">Web Infrastructure</category><category domain="http://blogs.msdn.com/benjguin/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category></item><item><title>SQL Server 2005: Migrate cursor developed stored procedures</title><link>http://blogs.msdn.com/benjguin/archive/2005/05/10/416110.aspx</link><pubDate>Tue, 10 May 2005 16:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:416110</guid><dc:creator>benjguin</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/benjguin/comments/416110.aspx</comments><wfw:commentRss>http://blogs.msdn.com/benjguin/commentrss.aspx?PostID=416110</wfw:commentRss><description>&lt;P&gt;In a recent mission, customer had many stored procedures using cursors. Those stored procedures contained business code and it was very important to avoid regressions. So I wondered how Visual Basic .NET stored procedures that could keep business logic would behave compared to pure SQL Statements and cursors.&lt;/P&gt;
&lt;P&gt;Here are the results of my tests:&lt;/P&gt;
&lt;P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&lt;STRONG&gt;&lt;U&gt;Stored procedure style&lt;/U&gt;		&lt;U&gt;Execution time&lt;/U&gt;&lt;/STRONG&gt;

Transact-SQL cursors		1 minute

Visual Basic .NET,
same logic as cursors		7 s

Transact-SQL, SQL style		&amp;lt; 1 s&lt;/FONT&gt; 
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;I was not surprised to see that SQL style was the fastest, but I also liked the result on VB .NET :-)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is the simple code I used&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Create a table&lt;/STRONG&gt; with 1000 rows. By self joining it, I will get a billion rows.&lt;/P&gt;&lt;PRE&gt;&lt;FONT size=3&gt;use misc&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;drop table tableA&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;create table tableA&lt;BR&gt;(&lt;BR&gt;&amp;nbsp;ID int primary key&lt;BR&gt;)&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;declare @i int;&lt;BR&gt;SET @i=1;&lt;BR&gt;WHILE @i &amp;lt;= 1000&lt;BR&gt;BEGIN&lt;BR&gt;&amp;nbsp;insert into tableA values(@i);&lt;BR&gt;&amp;nbsp;SET @i=@i+1;&lt;BR&gt;END&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;select count(*) from tableA&lt;BR&gt;go&lt;BR&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;VB .NET stored procedure code:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;FONT size=3&gt;Imports System&lt;BR&gt;Imports System.Data&lt;BR&gt;Imports System.Data.Sql&lt;BR&gt;Imports System.Data.SqlClient&lt;BR&gt;Imports System.Data.SqlTypes&lt;BR&gt;Imports Microsoft.SqlServer.Server&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;BR&gt;&lt;FONT size=3&gt;Partial Public Class StoredProcedures&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Microsoft.SqlServer.Server.SqlProcedure()&amp;gt; _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Shared Sub VBCursor()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim total As SqlTypes.SqlDecimal&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total = 0&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Using cn As New SqlConnection("context connection=true")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cmd As New SqlCommand( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "select cast(a.ID * b.ID as decimal) from tableA a, tableA b", _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cn)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cn.Open()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim reader As SqlDataReader&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader = cmd.ExecuteReader()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; While reader.Read()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total = total + reader.GetDecimal(0)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End While&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.Close()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cn.Close()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Using&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim resultRecord As New _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;FONT size=3&gt;SqlDataRecord(New SqlMetaData("result", SqlDbType.Decimal))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultRecord.SetDecimal(0, total.Value)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlContext.Pipe.Send(resultRecord)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;BR&gt;End Class&lt;BR&gt;&lt;/PRE&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;STRONG&gt;Transact-SQL stored procedures code&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;FONT size=3&gt;drop procedure TSQLSet&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;create procedure TSQLSet&lt;BR&gt;as&lt;BR&gt;&amp;nbsp;select sum(cast(a.ID * b.ID as decimal))&lt;BR&gt;&amp;nbsp;from tableA a, tableA b&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;drop procedure TSQLCursor;&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;BR&gt;&lt;FONT size=3&gt;create procedure TSQLCursor&lt;BR&gt;as&lt;BR&gt;&amp;nbsp;declare @current decimal;&lt;BR&gt;&amp;nbsp;declare @total decimal;&lt;BR&gt;&amp;nbsp;set @total=0;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;declare c cursor for &lt;BR&gt;&amp;nbsp;select cast(a.ID * b.ID as decimal)&lt;BR&gt;&amp;nbsp;from tableA a, tableA b;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;open c;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;fetch next from c into @current;&lt;BR&gt;&amp;nbsp;while @@fetch_status=0&lt;BR&gt;&amp;nbsp;begin&lt;BR&gt;&amp;nbsp;&amp;nbsp;set @total = @total + @current;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;&amp;nbsp;fetch next from c into @current;&lt;BR&gt;&amp;nbsp;end&lt;BR&gt;&amp;nbsp;close c;&lt;BR&gt;&amp;nbsp;deallocate c;&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;&amp;nbsp;select @total;&lt;BR&gt;go&lt;BR&gt;&lt;/FONT&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;Test execution code&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;FONT size=3&gt;exec TSQLSet&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;exec TSQLCursor&lt;BR&gt;go&lt;/FONT&gt;&lt;/PRE&gt;&lt;PRE&gt;&lt;FONT size=3&gt;exec VBCursor&lt;BR&gt;go&lt;BR&gt;&lt;/FONT&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=416110" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/benjguin/archive/tags/.NET+Framework+2.0+development/default.aspx">.NET Framework 2.0 development</category><category domain="http://blogs.msdn.com/benjguin/archive/tags/SQL+Server+2005/default.aspx">SQL Server 2005</category></item></channel></rss>