醉后的夜晚

SQL Server中使用CLR调用.NET方法

SQL Server2008支持在.NET中创建一个存储过程或者函数。这种方式对数据库提供一种扩展,大大的增加对数据操作的方便性。例如一些对数据较复杂的操作,用纯sql实现可能相对复杂,而通过C#之类的语言实现就方便了许多。

我们来通过一个案例来分析下:

     第一,   新建类库,引用命名空间,using Microsoft.SqlServer.Server;

     第二,   编写一个公共类,含有一个公共的静态函数,并且具有特性:[Microsoft.SqlServer.Server.SqlFunction(DataAccess=DataAccessKind.None)] ,其中的DataAccess=DataAccessKind.None ,意味该函数不访问用户数据,DataAccessKind.Read 枚举值表示需要访问。现在2010中也可以简写[SqlFunction]

     第三,   写一个方法进行操作,如:

 1   [SqlFunction]
 2         public static string Say(string strName)
 3         {
 4             return strName + "_beijing";
 5         }
 6    [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.None)]
 7         public static String Say()
 8         {
 9             return "hello,world";
10         }

    第四, 编译此类库。找出相关的类库中的dll文件。

    第五,   登陆sql,编写进行创建程序集:

CREATE ASSEMBLY CRLServer 
FROM 'D:\项目\Project\Demo\CRLServer2008\CRLServerDemo\CRLServer2008Library\bin\Debug\CRLServer2008Library.dll'
WITH permission_set = Safe; 

    注意:(1)这段代码的意思就是从本地一个dll中创建一个程序集,并且设置权限,默认有三种选择:SAFE | EXTERNAL_ACCESS | UNSAFE,

                    Safe模式就是最具限制性的权限集。由具有 SAFE 权限的程序集所执行的代码将无法访问外部系统资源,例如文件、网络、环境变量或注册表。

                    EXTERNAL_ACCESS 使程序集可以访问某些外部系统资源,例如文件、网络、环境变量以及注册表。

                    UNSAFE 可使程序集不受限制地访问资源,无论是 SQL Server 实例内部还是外部的资源都可以访问。从 UNSAFE 程序集内运行的代码可调用未托管代码。

           (2) dll版本和数据库版本有一定对应关系,Sql Server2008 使用请请用3.5的版本 dll不能是.net4.0

第六,创建一个函数变量来调用类库中的方法

1 CREATE FUNCTION CLR_ServerSay
2 (
3 @paymentinfo [nvarchar](max)
4 )
5 RETURNS [nvarchar](max) WITH EXECUTE AS CALLER, RETURNS NULL ON NULL INPUT
6 AS 
7 EXTERNAL NAME CRLServer.[CRLServer2008Library.SayHello].[Say]

 注意:程序集名.[类名].方法名;

         CRLServer属于程序集名称,CRLServer2008Library.SayHello 为命名空间名称 Say为方法名称;程序集名.[类名].方法名

第七:

   在第一次使用 sql server clr集成功能的时候,需要开启一个clr选项,执行以下语句:

EXEC sp_configure 'clr enabled', '1';
GO
RECONFIGURE;
GO

 第八:在SQL用使用此函数

select dbo.CLR_ServerSay('感谢你的使用')

 重要的注意事项:

   [SqlFunction]
        public static SqlBoolean RegexSearch(SqlChars input, string pattern)
        {
            return Regex.Match(new string(input.Value), pattern, RegexOptions.Compiled).Success;
        }
CREATE FUNCTION CLR_ServerRegexSearch
(
@strchar nvarchar(max), @paymentinfo [nvarchar](max)
)
RETURNS bit WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME CRLServer.[CRLServer2008Library.SayHello].[RegexSearch]

 

SqlString 数据类型转换成 nvarchar(4,000),而 SqlChars 转换成 nvarchar(max)。尽可能使用 nvarchar(max) 并且最大程度地保证灵活性。然而,如果所有相关字符串包含的字符都少于 4,000 个,使用 nvarchar(4,000) 则性能可得到显著改善。

CLR里返回的bool对应SQL Server里的bit,即:1/0/Null,而不是true/false,所以,没法直接用dbo.ContainsOne(txtContent,'柳永法')实现bool形,而得这么用:dbo.ContainsOne(txtContent,'柳永法')=1

 

posted on 2012-09-12 14:46  醉后的夜晚  阅读(469)  评论(0编辑  收藏  举报

导航