使用SQLServer2005的CLR存储过程
SQLServer2005的一大新特性便是整合了.net的CLR。整合了.netCLR的好处在于,可以很方便地使开发者可以使用自己熟悉的.net语言来创建存储过程,触发器,自定义函数等。在本文中,将以C#来创建存储过程。为什么不用T-SQL来创建存储过程呢?因为T-SQL发展到目前,已经很长时间了,在某些场合有其局限性,比如T-SQL不是面向对象的,某些语法过于复杂等。而如果使用面向对象的.NET语言来编写如存储过程等数据对象时,由于.net语言强大的特性,因此能写出更健壮和更优秀的存储过程。注意,通过SQLServer2005用.NET编写的存储过程,都是和用.NET语言编写一般应用的程序一样,都是managedcode。此外,CLR编程语言提供了T-SQL中所没有的丰富构造(例如数组和列表等)。与T-SQL(它是一种解释语言)相比,CLR编程语言之所以具有更好的性能,是因为托管代码是已编译的。对于涉及算术计算、字符串处理、条件逻辑等的操作,托管代码的性能可能要优于T-SQL一个数量级。在本文中,虽然可以用T-SQL来编写存储过程,但为了说明问题,还是以C#来写存储过程。步骤如下:
首先,打开VisualStudio2005beta2,选择c#语言,新建立一个database工程,命名为sqlproject1。此时,VisualStudio2005beta2会询问你,要与什么数据库进行关联。由于我们采用的是pubs这个数据库,因此我们选择机器名是本地机器,设置好sql的验证方式,选择pubs数据库,就可以了。(注意,在SQLServer2005中,pubs和northwind数据库不再是SQLServer2005的自带数据库了,需要到http://go.microsoft.com/fwlink/?LinkId=31995去下载)。接着,在工程建立完毕后,选择新增项目,选择storeprocedure存储过程,并以Authors.cs命名,再按确定,并输入以下代码:
usingSystem;
usingSystem.Data;
usingSystem.Data.Sql;
usingSystem.Data.SqlTypes;
usingMicrosoft.SqlServer.Server;
usingSystem.Data.SqlClient;
publicpartialclassStoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
publicstaticvoidGetAuthors()
{
SqlPipesp=SqlContext.Pipe;
using(SqlConnectionconn=newSqlConnection("contextconnection=true"))
{
conn.Open();
SqlCommandcmd=newSqlCommand();
cmd.CommandType=CommandType.Text;
cmd.Connection=conn;
cmd.CommandText="SelectDatePart(second,GetDate())"+"Astimestamp,*fromauthors";
SqlDataReaderrdr=cmd.ExecuteReader();
sp.Send(rdr);
}
}
[SqlProcedure]
publicstaticvoidGetTitlesByAuthor(stringauthorID)
{
stringsql="selectT.title,T.price,T.type,"+"T.pubdatefromauthorsA"+
"innerjointitleauthorTAonA.au_id=TA.au_id"+
"innerjointitlesTonTA.title_id=T.title_id"+
"whereA.au_id='"+@authorID+"'";
using(SqlConnectionconn=newSqlConnection("contextconnection=true"))
{
conn.Open();
SqlPipesp=SqlContext.Pipe;
SqlCommandcmd=newSqlCommand();
cmd.CommandType=CommandType.Text;
cmd.Connection=conn;
cmd.CommandText=sql;
SqlParameterparamauthorID=newSqlParameter("@authorID",SqlDbType.VarChar,11);
paramauthorID.Direction=ParameterDirection.Input;
paramauthorID.Value=authorID;
cmd.Parameters.Add(paramauthorID);
SqlDataReaderrdr=cmd.ExecuteReader();
sp.Send(rdr);
}
}
}