SQL Server 2005 / 2008学习笔记
——之 SQL Server中调用C#程序
1、SQL Server 2005/2008 中CLR集成背景
T-SQL在执行普通查询通常效率是很高的,当然这个前提是书写的SQL语句比较规范。但是在有些时候,例如执行循环等方面,其效率以及书写的复杂程序就稍显低效和复杂。因此,我们通常都是获取基础的数据集,然后在程序中进行数据再加工。
在SQL Server2005以上(含2005)版本中,在可编程性下面有个程序集,它可以扩展C#程序来完成以前的操作以及功能实现。也就是说,使用编程方法来创建数据库对象。通过在SQL Server中托管CLR(称为CLR集成)可以创建数据库对象包括触发器、存储过程、用户定义函数、用户定义类型和用户定义聚合函数,从而为一些方案提高性能。
2、SQL Server 2005/2008 中CLR集成概述
2.1 集成的优势
编程模式:无论是语言还是功能实现都胜于T-SQL
安全性能:托管代码在数据库引擎承载的公共语言运行时环境中运行
自定义性:能够定义数据类型和聚合函数
2.2 集成的设计
可靠性:不能让代码执行损害数据库引擎进程完整性的操作,例如弹出请求用户响应的消息框或退出进程。用户代码应不能覆盖数据库引擎内存缓冲区或内部数据结构。
伸缩性:如果在SQL Server内运行的用户代码可以直接调用操作系统线程化基元,就不能很好地与SQL Server任务计划程序集成,可能降低系统的可伸缩性。
安全性:在数据库中运行的用户代码在访问诸如表和列的数据库对象时,必须遵守SQL Server身份验证和授权规则。
性能:在数据库引擎中运行的托管用户代码与在服务器外运行的同一代码相比,应具有同等的计算性能。从托管用户代码进行数据库访问没有本机Transact-SQL快。
2.3 集成的启动
exec sp_configure 'clr enabled', 1; // 配置选项'clr enabled' 已从0 更改为1 reconfigure; // 安装 |
若要启用CLR集成,必须具有ALTER SETTINGS服务器级别权限,sysadmin和 serveradmin固定服务器角色的成员隐式拥有该权限。
集成的启动也可以采用以下这种方式:
利用SQL Server外围应用配置器工具。为打开这个工具,可在Microsoft SQL Server 2005配置工具菜单中选择“SQL Server外围应用配置器”。要配置CLR集成,可单击对话框底部的“功能的外部应用配置器”。在弹出的对话框中,选择左边Database Engine之下的CLR集成,然后选中右边的CLR集成复选框。单击确定按钮,从而启用该选项,同时关闭窗口。接下来就可以使用受管代码创建SQL Server中的对象了,例如创建存储过程。
3、SQL Server 2005/2008 中CLR手动集成与部属应用实例
3.1 创建类和受管代码
新建一个类库程序并命名为Regex,编写项目中的类代码(注意:每个方法都必须是静态的,否则会在注册这个方法的时候报出错误信息‘不存在该方法’),编译这个类库项目生成dll文件。要注意的是:这个类中需要引用两个命名空间using System.Data.SqlTypes;和using Microsoft.SqlServer.Server;
可以创建的数据库对象包括:用户定义函数、用户定义类型、存储过程和触发器。在此就不再一一介绍,具体可以参考代码。
在使用数据库连接字符串的时候有两个关键的点:其一是实例化SqlConnection;其二是需要添加conn = new SqlConnection("context connection=true");否则就会在使用这些数据库对象的时候,在查询分析器中报出如下错误信息(暂时无法给出图片,错误信息就是请求“System.Data.SqlClient.SqlClientPermission......类型的权限已失败”)
3.2 注册程序集
use 数据库名称; create assembly RegExp from dll文件路径 with permission_set=访问权限 |
说明:访问权限
权限集 |
SAFE |
EXTERNAL_ACCESS |
UNSAFE |
代码访问安全性 |
仅执行 |
执行和访问外部资源 |
无限制 |
编程模型限制 |
受限制 |
受限制 |
无限制 |
可验证性要求 |
有 |
有 |
无 |
调用本机代码的能力 |
不可以 |
不可以 |
可以 |
3.3 注册相关方法
Create 对象名称 方法名称 (参数变量<可选>) Returns 返回类型(<可选>) As External name [MyAssemblyName].[MyAssemblyName.MyClassName].[MyMethodName] |
SQL对象名称包括:
存储过程:create procedure
用户自定义函数:create function
触发器:create trigger
用户自定义类型:create type
聚合函数:create aggregate
3.4 使用相关方法,使用方式与T-SQL一样
4、SQL Server 2005/2008 中CLR自动集成与部署应用实例
新建一个SQL Server项目模板,点击确定后会要求添加数据库引用。
当项目建立后,在菜单中选择项目就可以任意添加里面的项。不管是添加什么样的新项,都需要引用using System.Data.SqlTypes;和using Microsoft.SqlServer.Server;(在这个方法里面,这两个命名空间是自动引用的),编写完代码就可以通过点击“生成<你的项目名称>”来生成项目。
与之前的方法有很大不同,它不需要编写很多的SQL语句,只需要点击“部署<你的项目名称>”就可以了。
这个方法我试着用Visual Studio 2005去匹配SQL Server 2008,但在添加数据库链接的时候弹出错误提示,“此服务器版本不受支持,必须安装SQL Server 2005 Beta 2 或更高版本”。我很疑惑的是,难道SQL Server 2008不比2005版本高么?
5、CLR集成的管理
5.1 创建
use 数据库名称; create assembly RegExp from dll文件路径 with permission_set=访问权限 |
5.2 更改
use 数据库名称; alter assembly RegExp from dll文件路径 with permission_set=访问权限 |
5.3 删除
use 数据库名称; drop assembly RegExp from dll文件路径 |
删除程序集时要保证所有引用该程序集的文件必须都要清理完毕后方可正确删除。
6、T-SQL与托管代码
既然T-SQL能够实现的功能通过托管代码也能实现,那么,是否就不需要编写业务层的代码了呢?不可以!SQLCLR是专用于在SQL Server中实现特定目的,而此时T-SQL可能不是正确的选择。也就是说,SQL CLR集成应该视为一种无法使用T-SQL显式表达逻辑的备选解决方案,而不是作为实现业务层逻辑的替代品。
T-SQL比较适合基于集合的操作,例如表格式数据;SQLCLR比较适合实现过程性代码和递归操作。