sqlserver 2005中,加入了很多新特性。对于开发人员来讲,最值得一提的是对XML的支持和CLR集成。当然,还有一些关于“高可用“(数据库集群/数据库镜像/日志传送等)的新特性,比较适合DBA,感兴趣的朋友可以了解一下。
相信很多人和我一样,一直很希望在sqlserver中非常灵活地编程,实现各种功能(能像在VS中使用C#编程一样的爽)。但是未能如愿,暂不说开发环境的问题(代码补全,配色等)。最主要的是,T-SQL这东西确实不适合做复杂的运算(对我这种菜鸟来讲确实有难度。对那些大牛来说估计不难),也缺乏面向对象编程的灵活性。连一些基本的数据结构也没有办法实现,更别提什么面向对象了。
有了sqlserver CLR集成后,这一切似乎就变了。什么是CLR ,到底什么是CLR集成?先看看MSDN的解释吧。
通过在 Microsoft SQL Server 中托管 CLR(称为 CLR 集成),可以在托管代码中编写存储过程、触发器、用户定义函数、用户定义类型和用户定义聚合函数。因为托管代码在执行之前会编译为本机代码,所以,在有些方案中可以大大提高性能。
通俗点讲,就是sqlserver 2005 版本之后,数据库引擎中加入了.NET Framework 的公共语言运行时 (CLR) 组件,可以更方便和.NET应用程序交互。
首先,新建一个sqlserver CLR 数据库项目,如图:
项目新建好之后,可以打开试图,看看结构,里面只包含一些测试示例的sql脚本。
接下来,新建一个普通的C#类,在类中定义一个方法。如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SqlServer.Server; namespace SqlServerProject1 { public class demo { [Microsoft.SqlServer.Server.SqlProcedure] public static void ClrProc() { SqlContext.Pipe.Send("Hello World"); } } }
SqlContext.Pipe.Send("Hello World");可以理解为像客户端发送一条结果,就像Response.Write输出一样。
给这个普通的方法,加上[Microsoft.SqlServer.Server.SqlProcedure]特性。其意义就是标记自己是个CLR 存储过程。
注:Attribute,有的人也称作属性,为了避免不和面向对象中的get/set混淆,故本人习惯称之为”特性“。和java中的注解差不多。
编译通过后,可以选择直接在VS的生成菜单下选择”部署“,也可以去数据库中手动创建。
打开指定数据库的查询窗口,开始写脚本,检查数据库配置,看看是否开启了clr支持,没有的话则手动去开启:
--查看系统配置 SELECT * FROM sys.configurations ORDER BY name GO --启用clr sp_configure 'clr enabled',1 go RECONFIGURE; GO
--创建程序集 CREATE ASSEMBLY SqlServerProject1 FROM N'C:\Users\Administrator\Documents\visual studio 2010\Projects\Database1\SqlServerProject1\bin\Debug\SqlServerProject1.DLL' WITH permission_set=SAFE GO -- --DROP ASSEMBLY SqlServerProject1 --go --创建CLR存储过程 (程序集.命名空间.类型.方法名) CREATE PROC dbo.helloworld AS EXTERNAL NAME SqlServerProject1.[SqlServerProject1.demo].ClrProc go --执行Clr存储过程 EXEC helloworld go
可以像调用普通的存储过程一样去执行它。看看结果,果然有了”HelloWorld“。呵呵。当然,这只是最简单的,目的是教大家如何创建。
当然,也可以创建复杂一点的存储过程/函数/触发器等。我就拿存储过程为例,做一个稍微复杂的,返回一个SqlDataReader对象。
直接在项目上右键,新建,选择存储过程即可(刚才新建一个普通类,是为了让大家理解其基本的实现和对应关系)。如图:
建好存储过程后,可以往方法里面添加一些简单的代码,执行一个基本的单表查询,然后返回给客户端一个SqlDataReader对象。代码如下:
using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void StoredProcedure1() { // 在此处放置代码 SqlConnection conn = new SqlConnection("context connection=true"); try { conn.Open(); SqlCommand cmd = new SqlCommand("SELECT count(*) FROM dbo.TempCatalog", conn); SqlDataReader dr = cmd.ExecuteReader(); SqlContext.Pipe.Send(dr); } catch (Exception) { conn.Close(); } } };
在sqlserver中创建好并执行存储过程后,检查一下结果,看是不是你想要的?
提示:手动重复加载、创建,可能会冲突。需要先删除后再重新创建。可以在sqlserver对象浏览器中检查,也可以使用如下sql语句查询相关信息。
SELECT * FROM sys.assemblies SELECT * FROM sys.assembly_files
根据有些微软方面的专家提示,在下面几种情况下,应该考虑使用CLR:
SQL中涉及大量的逻辑判断和逻辑运算。比如需要在数据库级别自定义加密算法,解密算法等。
T-SQL无法处理需求。比如需要在SQL中进行正则表达式的判断等。
逻辑判断或者循环分支过于复杂,有时需要使用大量游标进行处理(也不一定使用游标就会变慢,关键看敲代码的人)。
本文出自http://blog.csdn.net/dinglang_2009,转载请注明出处。