由于一些特殊原因,我們在sql server中需要調用.net dll中的函數來進行特殊操作。
例如,我寫了加密函數,希望通過sql代理執行字元串的加密操作,
1、開發一個.net版本的dll檔案
建立一個類庫程式命名為LINKJM,打開Visual Studio 2015,點選【檔案】,點選【建立】,并且項目命名為LINKJM
類代碼如下:
Public Class Entry
''' <summary>
''' 說明:對字元串進行des對稱加密,傳回加密後的字元串
''' </summary>
''' <param name="sourceStr">需要加密的字元串</param>
''' <param name="myPassKey">加密使用的Des.key(8位字元串)</param>
''' <param name="myPassCheckCode">加密使用的參考Des.LV(8位字元串)</param>
''' <returns>傳回加密後的字元串</returns>
''' <remarks></remarks>
Public Shared Function Encrypt(ByVal sourceStr As String, ByVal myPassKey As String, ByVal myPassCheckCode As String) As String
Dim des As New System.Security.Cryptography.DESCryptoServiceProvider '//定義DES算法
Dim inputByteArray As Byte()
inputByteArray = System.Text.Encoding.Default.GetBytes(sourceStr)
des.Key = System.Text.Encoding.UTF8.GetBytes(myPassKey) '//mypasskey des用8個字元.
des.IV = System.Text.Encoding.UTF8.GetBytes(myPassCheckCode) '//myPassCheckCode, desc用8個字元
Dim ms As New System.IO.MemoryStream
Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)
Dim sw As New System.IO.StreamWriter(cs)
sw.Write(sourceStr)
sw.Flush()
cs.FlushFinalBlock()
ms.Flush()
Encrypt = Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
End Function
End Class
最後編譯成LINKJM.dll
2、sql server伺服器中加載dll程式集
2.1、找到對應的資料庫,選擇【可程式設計性】下的【程式集】
右鍵點選程式集,選擇【建立程式集】如圖
2.2、加載指定的dll檔案。
如圖
這樣在程式集下面多了一個程式集。如圖
2.3、打開CLR調用,本身sql server預設是不打開的。需要執行下語句
exec sp_configure 'clr enabled', 1;
reconfigure;
3、設定一個函數調用dll内部的函數。
代碼如下:
create FUNCTION [dbo].[CardEncrypt](@cardno Nvarchar(80),@passkey varchar(50),@checkcode varchar(50))
RETURNS [nvarchar](200)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [LINKJM].[LINKJM.Entry].[Encrypt]
解讀說明:
函數中的三個參數基本是對應原有程式集中的Encrypt,順序一緻,并給出一個傳回值
ByVal sourceStr As String, ByVal myPassKey As String, ByVal myPassCheckCode As String
[LINKJM].[LINKJM.Entry].[Encrypt] 這段解讀 程式集.[空間.類名].函數
4、以上操作完畢後,就可以通過CardEncrypt函數調用進行字元串加密操作。
其他類似的函數,基本都可以類似操作,加強sql server自身的運算,實作一些sql server本身性能缺陷及功能無法實作的内容。