【转】SQL SERVER CLR存储过程实现

最近做一个项目,需要做一个SQL SERVER 2005的CLR的存储过程,研究了一下CLR的实现。为方便以后再使用,在这里总结一下我的实现流程,也供对CLR感兴趣但又不知道如何实现的朋友们做一下参考,如果有不同意见,望多指教。在这里先以实现CLR存储过程为例子来进行说明。

1。首先,启用数据库的CLR功能

sp_configure ‘clr enabled‘, 1;
          GO
          RECONFIGURE;
          GO

2。即然是要创建CLR存储过程,那么首先就得用C#(或者其它语言)编写一个类库实现存储过程要执行的逻辑。创建的这个类库可以有两种方法:一种是创建一个普通的C# Class library;另一个是用VS2008创建一个SQL Server Project,方法:New Project/Database Projects/Microsoft SQL Server/SQL CLR/SQL Server Project.

无论使用哪一种方法,最终都应满足下面这两个条件:

(1)对于SQL Server 2005,所使用的.net程序集必须是.NET 2.0的。

(2)要做为存储过程的方法,必须是static,public,且加有SqlProcedure附加属性。

1    [SqlProcedure]
2    public static void ExecSQLCLRProc(int messageID, int iVersion)
3    {
4
5    }

在这里我使用的是用VS建一个SQL Server Project,因为它可以自动为我们实现以上这两个步骤。有了[SqlProcedure]这个属性,SQL Server就可以使用这个公开的方法创建存储过程了。

3。建好CLR Project后,就需要将CLR实施到数据库了。

可以用两种方法实施:

(1):在VS2008中使用Deploy操作,就可以自动将建好的存储过实施到数据库。

(2):在T-SQL里执行:

CREATE ASSEMBLY FROM ‘DLL Path‘ WITH PERMISSION_SET = SAFE|EXTERNAL_ACCESS|UNSAFE为DLL创建程序集。

Create Proc NCIP_ParseMessage
                  params
              AS 
              EXTERNAL NAME methodpath

依据程序集里公开的方法创建存储过程。

重点说明的是,SQL Server对CLR程序集提供了三种访问权限级别:SAFE,EXTERNAL_ACCESS,UNSAFE。如果要实施的是SAFE的级别,那么直接使用上面的两种的方法中的任何一种就可以实施了。但是由于我在存储过程中要访问网络资源,所以要用EXTERNAL_ACCESS或UNSAFE的权限级别实现

4。实现EXTERNAL_ACCESS权限级别的CLR存储过程。(不推荐使用UNSAFE)

(1)对SQL CLR使用strong name.先用SN.exe生成一个SNK文件,右击项目-properties-Signing-选中Sign the assembly,选择生成的SNK文件。

(2)在数据库里为DLL生成一个KEY。

Use master
             CREATE ASYMMETRIC KEY SQLCLRKey FROM EXECUTABLE FILE = ‘DLL Path‘  
             CREATE LOGIN loginname FROM ASYMMETRIC KEY SQLCLRKey 
             GRANT EXTERNAL ACCESS ASSEMBLY TO loginname

然后在再用 3 中的方法就可以实现。

5。多个程序集相互引用。如果有多个程序集,并且之前存在引用的话,那么可能还需要做以下的操作:

(1)在每个被引用的project的AssemblyInfo.cs加下面的代码:

1 using System.Security;
2 [assembly: AllowPartiallyTrustedCallers]

(2)如果是用SQL Server Project,还要将项目属性/Assembly name 改为唯一的名字

(3)为每一个别Project生成一个SNK文件,并创建相应的ASYMMETRIC KEY,LOGIN,授于LOGIN相应的访问权限。

时间: 2024-08-04 16:38:38

【转】SQL SERVER CLR存储过程实现的相关文章

SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数

原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之前开发的系统要么因为历史原因用的是SQL2000要么根本用不着在SQL Server中启用CLR,所以一直没有尝试.最近因为项目的原因,在这方面做了一个调研,现在在这里分享一下心得. 首先要说明的是要在SQL Server中启用CLR必须是在SQL Server2005及以上版本,其次在默认情况下是

SQL Server CLR 使用 C# 自定义存储过程和触发器

这一篇博客接着上一篇博客继续介绍 SQL CLR Stored Procedure 和 CLR Trigger, 上一篇博客介绍了 SQL CLR Function 的使用,以及 CLR 程序集的注册和 CLR Function 的注册. 我的上一篇博客:SQL Server CLR 使用 C# 自定义函数 四.CLR Stored Procedure 接下来在之前的项目选择添加新项,选择 SQL CLR C# 存储过程. public partial class StoredProcedure

SQL Server CLR 集成简介

公共语言运行库 (CLR) 是 Microsoft .NET Framework 的核心,为所有 .NET Framework 代码提供执行环境. 在 CLR 中运行的代码称为托管代码. CLR 提供执行程序所需的各种函数和服务,包括实时 (JIT) 编译.分配和管理内存.强制类型安全性.异常处理.线程管理和安全性. 通过在 Microsoft SQL Server 中托管 CLR(称为 CLR 集成),可以在托管代码中编写存储过程.触发器.用户定义函数.用户定义类型和用户定义聚合函数. 因为托

SQL Server CLR 使用 C# 自定义函数

原文:SQL Server CLR 使用 C# 自定义函数 一.简介 Microsoft SQL Server 2005之后,实现了对 Microsoft .NET Framework 的公共语言运行时(CLR)的集成.CLR 集成使得现在可以使用 .NET Framework 语言编写代码,从而能够在 SQL Server 上运行,现在就可以通过 C# 来编写 SQL Server 自定义函数.存储过程.触发器等.我最初的目的是因为在 SQL Server 数据库中遇到数字的十进制与十六进制的

SQL Server中存储过程 比 直接运行SQL语句慢的原因

问题是存储过程的Parameter sniffing 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2. 经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete时),可将此复杂操作用

SQL Server创建存储过程(转载)

什么是存储过程? q       存储过程(procedure)类似于C语言中的函数 q       用来执行管理任务或应用复杂的业务规则 q       存储过程可以带参数,也可以返回结果 q       存储过程可以包含数据操纵语句.变量.逻辑 控制语句等 存储过程的优点 (1)执行速度快. 存储过程创建是就已经通过语法检查和性能优化,在执行时无需每次编译. 存储在数据库服务器,性能高. (2)允许模块化设计. 只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次.存储

SQL Server中存储过程比直接运行SQL语句慢的原因

原文:SQL Server中存储过程比直接运行SQL语句慢的原因 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1.       存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2.       经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query

在sql server中建存储过程,如果需要参数是一个可变集合怎么处理?

在sql server中建存储过程,如果需要参数是一个可变集合的处理 原存储过程,@objectIds 为可变参数,比如 110,98,99 ALTER PROC [dbo].[Proc_totalScore] @categoryKey int, @objectIds VARCHAR(MAX) AS BEGIN      SELECT c.Name,AVG(e.Score) Score FROM dbo.Sys_com_comment_main m      INNER JOIN dbo.sys

SQL SERVER 系统存储过程

Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储过程在创建时即在数据库服务器上进