在SQL Server中引用dll分為兩個步驟
1.創建一個dll文件(dll文件分成3種類型,詳細講其中兩種)
2.把dll文件放進SQL Server的程序集中。然后定義一個Function,就可以通過該Function來引用dll中的函數。
創建一個dll文件
1.點擊“文件”->“新建”->“項目”->類庫,把命名空間改成StringHelp,添加如下代碼
(框架必須改為.NET3.5及3.5以下,因為SQL Server 2008只是支持.NET 3.5及一下,.NET 4.0是2010年發布的,不支持也很正常)
namespace StringHelp //命名空間 { public class ClassConvert //類名 { //把輸入的字符串中的小寫字母變成大寫字母 public static string ToUpper(string vInputString) //函數必須為靜態函數,應為靜態函數不用實例化類就可以調用 { return vInputString.ToUpper(); } } }
第一種dll類型
using System.Text; using System.Net; using System.IO; namespace GetNewsByHttp { public class ClassGetNews {
//該函數是通過HttpWebRequest來獲取網頁
//具體代碼可以忽略,但是要記住這里使用到了網絡 public static string GetCnblogs(string vNewsUrl) { string returnValue = ""; HttpWebRequest Request =(HttpWebRequest) WebRequest.Create(vNewsUrl); Request.Method = "GET"; HttpWebResponse Response = (HttpWebResponse)Request.GetResponse(); StreamReader Reder =new StreamReader( Response.GetResponseStream(),Encoding.UTF8); returnValue= Reder.ReadToEnd(); Reder.Close(); Response.Close(); return returnValue; } } }
第二種dll類型,該類型的dll需要進行非對稱的簽名,切記切記
為什么要划分dll類型,待會在SQL Server中添加dll中會有進一步的說明。
2.右擊“項目”,點擊”生成“或者直接按F6
3.右擊“項目”,點擊“在文件資源管理系統中打開文件夾”,點擊bin->debug,然后就會看到一個StringHelp.dll文件。
在SQL中引用dll文件
1.允許SQL Server允許運行用戶程序集
在SQL Server中運行如下代碼
EXEC sp_configure 'clr enabled' , '1'; --0代表不允許,1代表運行 RECONFIGURE;
clr enabled的官方說明
2.根據不同的dll文件方式
首先說明一下這里的dll的划分方式。根據dll中的代碼使用到不同的資源,在SQL Server中運行程序集(dll)是,必須指明是在以下三種安全級別的哪一種下運行。
- SAFE(它只能通過進程中的托管提供程序在服務器內執行計算和數據訪問)
- EXTERNAL_ACCESS(適用於代碼需要訪問服務器之外的資源(如文件、網絡、注冊表和環境變量))
- UNSAFE(程序集並非可驗證為安全的,或程序集要求進一步訪問受限資源(如 Microsoft Win32 API))
2.1第一種dll
直接使用SQL語句創建程序集
create assembly TestDll from 'C:\Users\聰\Documents\Visual Studio 2012\Projects\StringHelp\StringHelp\obj\Debug\StringHelp.dll'
其中TestDll是你在數據庫中為這個程序集起的名字。
2.2第二中dll
方法一:
(1)過程序集文件創建非對稱密鑰。
(2)必須創建映射到此非對稱密鑰的登錄名
(3)向此登錄名授予 EXTERNAL ACCESS ASSEMBLY 或 UNSAFE ASSEMBLY 權限。
USE master --這個數據庫一定是master
--創建非對稱密鑰
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\Users\聰\Documents\visual studio 2012\Projects\GetNewsByHttp\GetNewsByHttp\bin\Debug\GetNewsByHttp.dll'
--創建登錄名
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey
--把權限授予給該登錄名 GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;
方法二:
在SQL Server中執行如下代碼
ALTER DATABASE myDataBase SET TRUSTWORTHY ON
注意,如果你的dll文件中,引用了其dll文件,那么必須在引入dll之前,先引用其程序集。如你的dll文件使用到了system.web dll文件,那么必須在引用TestDll之前
以同樣的方法引用system.web dll文件。
2.創建一個Function,使用該dll文件
使用如下SQL語句
CREATE FUNCTION dbo.ToUpper --該函數名字 ( @InputString as nvarchar(500) ) RETURNS nvarchar(200) --返回類型 AS EXTERNAL NAME TestDll.[StringHelp.ClassConvert].ToUpper
Create Function GetNews ( @FileName nvarchar(50) ) returns nvarchar(max) as EXTERNAL NAME SQLCLRTest.[GetNewsByHttp.ClassGetNews].GetCnblogs
注意一下標紅的那幾個單詞。
TestDll是指你程序集中dll的名稱。
StringHelp是指dll文件中那個類的命名空間
ClassConvert是指dll文件中那個類的類名
ToUpper是指dll文件中那個被調用的靜態方法
最后,便可以這樣來調用該函數
print dbo.ToUpper('abc')
輸出的結果為ABC
print dbo.GetNews('http://www.cnblogs.com/WEI-CONG/p/4324715.html')
輸出的結果為本網頁的html代碼
最后感謝該文章給我的啟示http://www.cnblogs.com/zhongxinWang/p/4211179.html
每天進步一點點
2015-03-09