SQL Server 2005中的CLR(1)
2010-04-07 18:10 苏飞 阅读(4879) 评论(7) 编辑 收藏 举报http://www.sufeinet.com/thread-2117-1-1.html
简介
Microsoft 通过宿主 Microsoft .NET Framework 2.0 公共语言运行库 (CLR),SQL Server 2005显著地增强了数据库编程模型的功能。它支持用任何 CLR 语言(特别是 Microsoft Visual C# .NET、Microsoft Visual Basic .NET 和 Microsoft Visual C++)编写过程、触发器和函数。同时,它还提供了扩展数据库系统中的类型系统和聚合函数的功能,方法是允许应用程序创建它们自己的数据类型和聚合函数。
CLR 集成概述
Visual Studio 2005 支持在 SQL Server 2005 中开发、部署和调试托管代码。有一种新的项目类型(称为 SQL Server 项目),它允许开发人员在 SQL Server 中开发、部署和调试例程(函数、过程和触发器)、类型和聚合。
构建和部署
SQL Server 项目提供了代码模板,这使得开发人员能够轻松地开始为基于 CLR 的数据库例程、类型和聚合编写代码。该项目还允许添加对数据库中其他的程序集的引用。在构建项目时,可以将其编译成一个程序集。部署此程序集可以将程序集的二进制文件上载到与该项目相关联的 SQL Server 数据库中。部署操作还自动创建在数据库的程序集中定义的例程、类型和聚合,方法是使用在代码中定义的自定义属性(SqlProcedure、SqlFunction 和 SqlTrigger 等等)。它还上载与该程序集相关联的源代码和 .pdb 文件(调试符号)。
调试
对于任何平台来说,调试都是开发人员体验的基本部分。SQL Server 2005 和 Visual Studio 2005 为数据库编程人员提供了这些功能。调试 SQL Server 2005 对象的关键部分在于其易于安装和使用。调试到运行 SQL Server 的计算机的连接在很大程度上同调试传统操作系统中运行的进程的方式一样。调试器的功能不会受到客户端到服务器的连接类型的影响。这样就可以调试表格数据流 (TDS) 和 HTTP 连接。而且,还可以跨语言进行无缝调试。因此,如果有一个调用 CLR 存储过程的 T-SQL 存储过程,调试会允许您从 T-SQL 过程进入到 CLR 过程。
在这里我只是简单的介绍一下吧,其实还有很多这方面的知识,大家可以到微软的官方网站上去查看一下我给个链接吧方便查找
http://www.microsoft.com/china/msdn/library/data/sqlserver/sqlclrguidance.mspx?mfr=true 这上面说的很细,包括Clr和Xp的特性也有介绍
在这里我分享一下我经常使用的一些功能 吧,CLR 集成到低是做什么的呢?大家平时在数据库里写的存储过程 ,函数,还有触发器等这些东西都 是存在于数据库里的,不能跟前台的程序代码发生关系,Clr大家都 知道是支持语言的基本环境,有了他,我们就可以在Sql里部署我们用c#或是VB编写的代码了,也就是说我们在c#里写一个函数可以在Sql里直接被执行,大家是不是感觉这样很神奇呢?如果真的是这样的话,那以后数据库里再有什么复咋的逻辑直接用c#代码写一定会很方便,下面我就一个一个的很大家分享一下吧,我们先从函数入手吧
CLR中的函数
第一步 建立环境
首先我们要打开Sql2005的IDE,新建 一个数据库,这个过程 就不多说了,数据库名称 是 Text
下在我们打开VS2005 或是2008(选择.net2.0因为这里只支持2.0的CLR)新建项目
在这里跟新建其它项目就有很大不同的,我们要选择一个Office下的数据库,选择SqlServer项目 名称为 SqlClrProject 位置您可以自己选择电脑上的任意位置就可以了,单击确定
在这里我们要选择一下自己的数据,如果你不是第一次的话那么会默认的列出所有选择过的数据库,而这里我的选择过了所以出现一个 已有的选择项,当然如果 你是第一次的话 是没有选择项目的,这时我们单击 添加新引用(A)...
相信这里大家都 很熟悉了吧,选择一下我们刚刚建好的数据库吧,
然后单击确定
在这里我们单击是就可以了,因为我们得启用它来调试我们下面的操作
新建好的项目结构如上图所显
因为我们这里要使用函数,所以我们右击项目---添加
我们可以看的到里面已经出了很多数据库中常用的对象了,
我们单击新建项也就是第一个
我们给函数名称改为StrCount意思就是统计一下输入的字符个数
我们选择的是用户定义的函数
好了单击添加就可以了,
系统会自动生成一段代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
//表示注册为Sql中的函数
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString StrCount()
{
// 在此处放置代码
return new SqlString("Hello");
}
};
到这里我们的前期准备工作就完了,我们只要修改这个类就行了,
[Microsoft.SqlServer.Server.SqlFunction]
这句是表示在Sql中的对象类型
SqlFunction 就是函数
SqlProcedure 存储过程
SqlTrigger 触发器
还有其它的大家自己查看一下吧
第二步 部署自己定义函数
我们这个函数是用来计算字符长度的我把完成的代码放在下在面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
//表示注册为Sql中的函数
[Microsoft.SqlServer.Server.SqlFunction]
public static string StrCount(string str)
{
// 返回字符串的长度
return str.Length.ToString();
}
};
现在函数写好了,这个函数就不做过多的解释了, 因这这个只是得到字符串的长度这东西太基础了,呵呵
我们怎么样才能在Sql2005里使用我们这个函数呢?
其实很简单我们生成一下项目,生成成功之后,我们右击项目
单击部署项目,等部署成功就可以了。那我们部署的程序在那里呢,现在我们打开Sql2005IDE
找到如下图所示
我们会发现在Sql2005里的标题值函数里出现了一个我们自己定义的函数,那怎么使用他呢,很简单其实是跟我们平时使用的是一样的
我们新建查询
因为我们Sql默认的是关闭CLR功能的,我们需要用命令开启一下
看到如上图所显示的就表示 你的功能开启成功了,下面我们就可以自由的使用函数了,跟使用系统自己定义的函数是一样的,下面我统计几个大家可以看下图
这样一这样
这样就是利用sql的ClR执行c#程序了,是不是很方便,当然我们可以根据自己的需要把这个函数改的复咋一下,不过方法都是一样的像存储过程和触发器的实现原理都 也是这样的。
我加上一段,调试功能 是.net里用来解决问题最多的功能了,那CLR是否支持呢?答案是肯定的,只要我们在这个Text.Sql文件里打个段点就行了,因为在这个文件里执行的结果和数据库里的是一样的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
-----------------------------------------------------------------------------------------
-- 存储过程
-----------------------------------------------------------------------------------------
-- exec StoredProcedureName
-----------------------------------------------------------------------------------------
-- 用户定义的函数
-----------------------------------------------------------------------------------------
-- select dbo.FunctionName()
-----------------------------------------------------------------------------------------
-- 用户定义的类型
-----------------------------------------------------------------------------------------
-- CREATE TABLE test_table (col1 UserType)
-- go
--
-- INSERT INTO test_table VALUES (convert(uri, 'Instantiation String 1'))
-- INSERT INTO test_table VALUES (convert(uri, 'Instantiation String 2'))
-- INSERT INTO test_table VALUES (convert(uri, 'Instantiation String 3'))
--
-- select col1::method1() from test_table
-----------------------------------------------------------------------------------------
-- 用户定义的类型
-----------------------------------------------------------------------------------------
-- select dbo.AggregateName(Column1) from Table1
select '要运行项目,请编辑项目中的 Test.sql 文件。此文件位于解决方案资源管理器的 Test Scripts 文件夹中。'
我们可以跟自己的Sql语句结合起来使用,就是用到我们自己定义的存储过程里这样可以把复咋的逻辑用c#代码来实现是不是感觉很方便,Clr是个好东西,他不仅仅只有这些,还有什么高级的功能 呢,我们下次博文接着说吧!!!
为了方便大家写代码我在这里加上
EXEC sp_configure 'show advanced options','1';
go
EXEC sp_configure 'clr enabled','1'
go
reconfigure with override;
go