简介:有时候Sql Server的内置函数没有那么好用的时候,可以引用一下外部程序集,下面献下丑,做下添加外部程序集操作
1、准备程序,编译出一个MyCLR的DLL.
public class CLRClass { [Microsoft.SqlServer.Server.SqlFunction] public static int MyFun(int a, int b) //必须使用静态方法,非静态方法会报错。 { return a <= b ? a : b; //其实就是一个判断最小值函数 } }
2、添加程序集。
CREATE ASSEMBLY MyClr1 FROM ‘I:\Test\MyClr\MyClr\bin\Release\MyClr.dll‘ WITH permission_set = Safe/EXTERNAL ACCESS/UnSafe; -- (默认推荐/可以访问外部资源/不受限制地访问资源)
- 对于使用 SAFE 或 EXTERNAL ACCESS 权限集创建的程序集:
- 程序集代码应是类型安全的。通过对程序集运行公共语言运行时验证工具可建立类型安全。
- 程序集的类中不应包含任何静态数据成员,除非这些成员标记为只读。
- 程序集中的类不能包含终结器方法。
UNSAFE 模式是不受任何限制的访问资源。
这是联机手册上面对这几种模式的限制。
如果有静态变量,在Safe 模式下就会报错了
public class CLRClass { static int i = 0; [Microsoft.SqlServer.Server.SqlFunction] public static int MyFun(int a, int b) //必须使用静态方法,非静态方法。 { i += 1; return a <= b ? a : b; }
然后在数据库执行
ALTER ASSEMBLY MyClr1 FROM ‘I:\Test\MyClr\MyClr\bin\Release\MyClr.dll‘ WITH permission_set = Safe;
叮叮,立即中奖
解决方法。去掉静态变量,将静态变量改为ReadOnly模式,或者将程序集改为 UNSAFE模式。
去掉静态变量和ReadOnly就不说了。
改变为UNSAFE模式,可以执行以下语句
ALTER DATABASE TestDB set TRUSTWORTHY ON; -- 数据库所有者(DBO)拥有 UNSAFE ASSEMBLY 权限,且数据库具有 TRUSTWORTHY 数据库属性;或者,程序集已使用其对应登录名具有 UNSAFE ASSEMBLY 权限的证书或非对称密钥加以签名 go ALTER ASSEMBLY MyClr1 FROM ‘I:\Test\MyClr\MyClr\bin\Release\MyClr.dll‘ WITH permission_set = UNSAFE; go --执行成功
创建了程序集,然后添加个函数映射来使用
添加函数映射 CREATE function ClrFBitContains ( @a as INT , @b as int ) returns INT as EXTERNAL NAME MyClr1.CLRClass.MyFun 确认是否需要打开CLR执行权限 exec sp_configure ‘clr enabled‘, ‘1‘ reconfigure SELECT dbo.ClrFBitContains(1,3) PS:每次修改完动态库,需要重新执行修改一次程序集定义才能更新同步上去 CREATE ASSEMBLY MyClr1 FROM ‘I:\Test\MyClr\MyClr\bin\Release\MyClr.dll‘