標籤:style blog http color io os 使用 資料 div
簡介:有時候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 MyClr1FROM ‘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 許可權的認證或非對稱金鑰加以簽名 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‘
好~搞掂
Sql Server 添加外部程式集基本操作