设为首页 收藏本站
查看: 1474|回复: 0

[经验分享] 初探SQL Server CLR 集成

[复制链接]

尚未签到

发表于 2015-6-27 18:23:11 | 显示全部楼层 |阅读模式
  SqlServer 2005中,加入了很多新特性。对于开发人员(尤其是从事.NET开发的朋友)来讲,最值得一提的是对XML的支持以及CLR集成。当然,还有一些关于“高可用“(数据库集群/数据库镜像/日志传送等)的新特性,这些更适合DBA们学习和使用。当然不止我列举的这些,感兴趣的朋友,可以参考并学习webcast《sqlserver 2005盛宴系列》。
  
相信很多朋友和我一样,一直很希望在sqlserver中能够非常灵活地编程,来实现各种功能(能像在VS中使用C#编程一样的爽)。但是一直未能如愿,暂不说开发环境的问题(代码补全,配色等方面)。最主要的是,T-SQL这语言本身就不适合做复杂的运算(对我这种菜鸟来讲确实有难度。对那些大牛来说估计不难),也缺乏面向过程/面向对象编程的灵活性。连一些基本的数据结构也没有办法实现(在C#里面,又是强类型又是泛型集合,在sql里面,恐怕智能用临时表、表变量、CTE公共表表达式之类的玩意了),更别提什么面向对象特性了。哈哈。
  
但是,有了sqlserver CLR集成后,这一切似乎就变了。什么是CLR (搞.NET几乎都知道),到底什么是CLR集成?先看看MSDN的解释吧。
通过在 Microsoft SQL Server 中托管 CLR(称为 CLR 集成),可以在托管代码中编写存储过程、触发器、用户定义函数、用户定义类型和用户定义聚合函数。 因为托管代码在执行之前会编译为本机代码,所以,在有些方案中可以大大提高性能。
  通俗点讲,就是sqlserver 2005 版本之后,数据库引擎中加入了 .NET Framework 的公共语言运行时 (CLR) 组件,可以更方便和.NET应用程序交互。
  首先,新建一个sqlserver CLR 数据库项目,如图:
DSC0000.gif
DSC0001.gif
  项目新建好之后,可以打开试图,看看结构,里面只包含一些测试示例的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");
}
}
}
  记得要引入using Microsoft.SqlServer.Server这个命名空间。在方法体中,使用了如下代码:



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
  准备完毕后,开始创建程序集和CLR存储过程:



--创建程序集
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
  注意,之前的项目中编译后的DLL文件的路径(推荐使用绝对路径),权限直接给safe。创建CLR存储过程,其实和普通的proc差不多,只不过多了一句(大致意思就是指定程序集中指定的命名空间下的类和对应的方法)
  可以像调用普通的存储过程一样去执行它。看看结果,果然有了”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();
}
}
};
  编译完成后,可以在VS的生成菜单下选择”部署“(会自动部署到sqlserver中,并覆盖原来的)。当然,也可以手动去重新加载程序集并创建需要的存储过程。
  在sqlserver中创建好并执行存储过程后,检查一下结果,看是不是你想要的?
  提示:手动重复加载、创建,可能会冲突。需要先删除后再重新创建。可以在sqlserver对象浏览器中检查,也可以使用如下sql语句查询相关信息。



SELECT * FROM sys.assemblies
SELECT * FROM sys.assembly_files
  简单的例子做完了,优点是可想而知的。那到底啥时候应用CLR,啥时候写纯T-sql呢?我觉得具体要根据实际业务需求和应用场景去判断了。
  根据有些微软方面的专家提示,在下面几种情况下,应该考虑使用CLR:
SQL中涉及大量的逻辑判断和逻辑运算。比如需要在数据库级别自定义加密算法,解密算法等。
T-SQL无法处理需求。比如需要在SQL中进行正则表达式的判断等。
逻辑判断或者循环分支过于复杂,有时需要使用大量游标进行处理(也不一定使用游标就会变慢,关键看敲代码的人水平如何)。
  
  本文出自http://www.iyunv.com/dinglang/         http://blog.iyunv.com/dinglang_2009,转载请注明出处。
  
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81050-1-1.html 上篇帖子: SQL Server复制入门(二)----复制的几种模式 下篇帖子: SQL Server:把CSV文件导入到SQL Server表中
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表