如何在SQL Server中加入
C# CLR Function
黃家瑞 Jerry Huang
- 恆逸教育訓練中心-資深講師
- 技術分類:程式設計
Microsoft SQL Server除了提供豐富的日期時間、數值、字串以及各種類型的函數外,可以自訂使用者函數。但是,寫過Microsoft SQL Server自訂函數就會知道,SQL Server Transact-SQL提供的流程控制語法較少(僅有IF, WHILE, GOTO),缺少.NET BCL(Base Class Library)數以萬計的函式庫支援,寫一些較為複雜的功能時,就顯得有些捉襟見肘了。為增加這個擴充能力,SQL Server 2005(及之後的版本)提出了一個解決方案—CLR Function。
CLR Function可以在Visual Sutdio中,利用.NET的程式語言開發SQL Server所需的函式(Function)、預存程序(Stored Procedure)甚至是觸發程序(Trigger)等物件,連結至SQL Server資料庫中,在SQL語法中執行。例如,在C#中寫一個MD5加密功能,對一個具備C#程式設計基礎的人不是太困難的一件事情(提示:使用Google,鍵入關鍵字”MD5 C#”,會有相當多的程式範例可參考),但是在SQL Server中要寫出這樣的函式,可就不是那麼簡單了。以下就以這個在SQL Server中加入MD5加密功能為例,來介紹『如何在SQL Server中加入C# CLR Function』。
要完成這個程式之前,請先準備以下的應用程式:
XX【MAC address的第四碼】的產生原則,是vCenter Server在安裝或是deploy時,會從 0-63,隨機挑一個數字。
- Microsoft SQL Server 2016 Developer Edition
(也可以使用SQL Server Express版本,但必須做過測試,因為在一些彙總函數的CLR Function不支援,都可以在微軟官方網站免費下載)。 - SQL Server Management Studio 2016
(可以在微軟官方網站免費下載)。 - Microsoft Visual Studio Community 2015
(可以在微軟官方網站免費下載) - SQL Server Data Tools
(SSDT: SQL Server的附加套件,可以在微軟官方網站下載)。
以下有幾個步驟:
步驟一、在Visual Studio Community 2015中完成CLR_Function.DLL組件。進入Visual Studio,開啟新專案,使用 SQL Server範本,選擇SQL Server資料庫專案,方案名稱:CLR_Solution,名稱:CLR_Function。
![](20180402/01.jpg)
按下確定後,在方案總管中,CLR_Function上右鍵,選擇加入,選擇新增項目。
![](20180402/02.jpg)
跳出的視窗中,選擇 SQL CLR C#以及SQL CLR C#使用者定義函式,名稱中輸入:MD5_Encrypt.cs,按新增。
![](20180402/03.jpg)
完成以下的MD5加密程式碼。
using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Text; using System.Security.Cryptography; public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction] public static SqlString MD5_Encrypt(SqlString s) { // 將程式碼放在此處 string hash = ""; MD5CryptoServiceProvider md5provider = new MD5CryptoServiceProvider(); byte[] bytes = md5provider.ComputeHash(new UTF8Encoding() .GetBytes(s.ToString())); for (int i = 0; i < bytes.Length; i++) { hash += bytes[i].ToString("x2"); } return new SqlString (hash.ToString()); } }
在方案總管中,編譯成 CLR_Function.DLL。
步驟二、在SQL Server Managemant Studio中將CLR_Function.DLL加入Database的Assembly。
進入SSMS中,建立資料庫 db01,在物件瀏覽器中,展開databases=>db01=>Programmability=>Assembly上按右鍵,New Assembly,建立新的組件。
![](20180402/04.jpg)
在開啟的視窗中,選取Browse選擇在前一步驟完成的 CLR_Function.DLL。
![](20180402/05.jpg)
此時在物件瀏覽器中會新增一個組件CLR_Function。
![](20180402/06.jpg)
執行以下的SQL語法:
USE db01; GO CREATE FUNCTION dbo.MD5Encrypt(@src nvarchar(100)) RETURNS nvarchar(1000) EXTERNAL NAME CLR_Function.UserDefinedFunctions.MD5_Encrypt GO
建立CLR Function的語法:
CREATE FUNCTION dbo.MD5Encrypt(@src nvarchar(100)) RETURNS nvarchar(1000)
dbo.MD5Encrypt是指在SQL中建立的函式名稱,其回傳值、參數值的型別與個數必須與C#中定義的函式簽章(Signature)一致。
EXTERNAL NAME CLR_Function.UserDefinedFunctions.MD5_Encrypt
EXTERNAL NAME的定義為 [組件名稱].[類別名稱].[方法名稱]。
步驟三、測試CLR Function。
USE db01; GO SELECT dbo.MD5Encrypt(N’Hello world!’);
執行結果:
![](20180402/07.jpg)