簡介:有時候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; -- (默認推薦/可以訪問外部資源/不受限制地訪問資源)
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 MyClr1FROM 'I:/Test/MyClr/MyClr/bin/Release/MyClr.dll' WITH permission_set = Safe;
叮叮,立即中獎
ALTER DATABASE TestDB set TRUSTWORTHY ON; --數據庫所有者(DBO)擁有 UNSAFE ASSEMBLY 權限,且數據庫具有 TRUSTWORTHY 數據庫屬性;或者,程序集已使用其對應登錄名具有 UNSAFE ASSEMBLY 權限的證書或非對稱密鑰加以簽名 goALTER ASSEMBLY MyClr1FROM 'I:/Test/MyClr/MyClr/bin/Release/MyClr.dll' WITH permission_set = UNSAFE;go--執行成功
創建了程序集,然后添加個函數映射來使用
添加函數映射CREATE function ClrFBitContains( @a as INT , @b as int )returns INTas EXTERNAL NAME MyClr1.CLRClass.MyFun確認是否需要打開CLR執行權限exec sp_configure 'clr enabled', '1'reconfigureSELECT dbo.ClrFBitContains(1,3)PS:每次修改完動態庫,需要重新執行修改一次程序集定義才能更新同步上去CREATE ASSEMBLY MyClr1 FROM 'I:/Test/MyClr/MyClr/bin/Release/MyClr.dll'好~搞掂
新聞熱點
疑難解答