最近做一个项目,需要做一个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附加属性。

    [SqlProcedure]
public static void ExecSQLCLRProc(int messageID, int iVersion)
{ }

在这里我使用的是用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加下面的代码:

 using System.Security;
[assembly: AllowPartiallyTrustedCallers]

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

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

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

  1. SQL Server ->> CLR存储过程枚举目录文件并返回结果集

    因工作需要写了个CLR存储过程枚举目录文件并返回结果集 using System; using System.IO; using System.Collections.Generic; using S ...

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

    原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...

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

    资源来源:https://www.cnblogs.com/Brambling/p/8016060.html SQL Server CLR 使用 C# 自定义存储过程和触发器   这一篇博客接着上一篇博 ...

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

    一.简介 Microsoft SQL Server 2005之后,实现了对 Microsoft .NET Framework 的公共语言运行时(CLR)的集成.CLR 集成使得现在可以使用 .NET ...

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

    在sql server中建存储过程,如果需要参数是一个可变集合的处理 原存储过程,@objectIds 为可变参数,比如 110,98,99 ALTER PROC [dbo].[Proc_totalS ...

  6. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  7. SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过

    SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过     存储过程 创建存储过程 use pubs --pubs为数据库 go create proc ...

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

    问题是存储过程的Parameter sniffing     在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1. 存储过程只在创造时进行编译即可,以后每次执行存储过 ...

  9. ADO.NET访问SQL Server调用存储过程带回参

    1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign  use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...

随机推荐

  1. 209. Minimum Size Subarray Sum

    Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...

  2. leetcode 126. Word Ladder II ----- java

    Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transformat ...

  3. codevs 1704 卡片游戏

    题目描述 Description 桌面上有一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n.当至少还剩两张排时进行一下操作:把第一张牌扔掉,然后把新的第一张牌放到整叠牌的最后.输入n. ...

  4. 正确答案 全国信息学奥林匹克联赛( ( NOIP2014) 复 赛 模拟题 Day1 长乐一中

    [题目描述]小 H 与小 Y 刚刚参加完 UOIP 外卡组的初赛,就迫不及待的跑出考场对答案."吔,我的答案和你都不一样!",小 Y 说道,"我们去找神犇们问答案吧&qu ...

  5. Java—面向对象—权限修饰符及思维导图

    课上老师所讲实例整理: package org.hanqi.pn0120; //汽车 public class Car { //颜色 private String yanse; //品牌 privat ...

  6. Java基础相关

    对老师上课内容进行总结: 1.新建一个Java项目,并命名为HelloWorld 然后再新建类,并命名为HelloWorld,注意红色画圈部分 若勾选,则新建类开头为(“//后的内容为老师所讲批注”) ...

  7. html5图片懒加载

    http://www.178.com/s/js/jquery.lazyload.min.js

  8. JSBinding / Run Samples

    This document shows you how to run JSBinding 2048 sample in Editor. First of course, create an empty ...

  9. 高斯混合模型参数估计的EM算法

    # coding:utf-8 import numpy as np def qq(y,alpha,mu,sigma,K,gama):#计算Q函数 gsum=[] n=len(y) for k in r ...

  10. Textarea高度随内容自适应地增长,无滚动条

    <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; char ...