SQL Server 2005 引入 CLR 整合,允許使用 C#/VB.NET 編寫預存程序、函數、觸發器、使用者定義型別。對於複雜字串操作、正則運算式、加密演算法等 T-SQL 不擅長的場景,CLR 提供效能與開發效率的雙重提升。本文以「逗號分隔字串排序」為例,完整示範 CLR 函數開發部署流程。
SSMS → 連接 Database Engine → 右鍵伺服器 → Facets → ClrIntegrationEnabled = True,或執行:
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
' 檔名:SQLServerCLRSortString.vb
Imports System
Imports Microsoft.SqlServer.Server
Public Class CLRFunctions
Public Shared Function SortString(ByVal Input As String) As String
If Input Is Nothing Then Return Nothing
Dim parts() As String = Input.Split(","c)
Array.Sort(parts) ' .NET 內建快速排序
Return String.Join(",", parts) & "," ' 保持尾隨逗號風格
End Function
End Class
C:\Windows\Microsoft.NET\Framework\v2.0.50727\vbc.exe /target:library SQLServerCLRSortString.vb
產出 SQLServerCLRSortString.dll,複製至 SQL Server 主機可存取路徑(如 C:\CLRAssemblies\)。
USE YourDatabase;
GO
CREATE ASSEMBLY CLRFunctions
FROM 'C:\CLRAssemblies\SQLServerCLRSortString.dll'
WITH PERMISSION_SET = SAFE; -- 純運算無外部存取,SAFE 即可
GO
CREATE FUNCTION dbo.SortString(@Input NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS EXTERNAL NAME CLRFunctions.[CLRFunctions].SortString;
GO
三部曲命名規則:組件名稱.類別完整名稱.方法名稱。
CREATE TABLE dbo.TestSort (Data VARCHAR(MAX));
INSERT dbo.TestSort VALUES
('apple,pear,orange,banana,grape,kiwi'),
('pineapple,grape,banana,apple'),
('apricot,pear,strawberry,banana'),
('cherry,watermelon,orange,melon,grape');
GO
SELECT Data AS Original, dbo.SortString(Data) AS Sorted
FROM dbo.TestSort;
| Original | Sorted |
|---|---|
| apple,pear,orange,banana,grape,kiwi | apple,banana,grape,kiwi,orange,pear, |
| pineapple,grape,banana,apple | apple,banana,grape,pineapple, |
| apricot,pear,strawberry,banana | apricot,banana,pear,strawberry, |
| cherry,watermelon,orange,melon,grape | cherry,grape,melon,orange,watermelon, |
DROP FUNCTION dbo.SortString;
DROP ASSEMBLY CLRFunctions;
DROP TABLE dbo.TestSort;
| 主題 | 建議 |
|---|---|
| 權限集 | 純運算用 SAFE;需檔案/網路/登錄存取用 EXTERNAL_ACCESS(需簽章/資料庫 TRUSTWORTHY);需 Unmanaged 代碼用 UNSAFE(極少數、嚴格審核)。 |
| 確定性標記 | IsDeterministic=true 允許優化器將結果納入計畫快取,提升效能。 |
| NULL 處理 | CLR 方法需顯式處理 null 輸入,回傳 null 或拋出例外(對應 T-SQL 行為)。 |
| 部署自動化 | 使用 SSDT (SQL Server Data Tools) 專案,編譯、部署、版本控制一體化,避免手工複製 DLL。 |
| 效能基準 | 大量資料(百萬列)排序時,CLR 通常比 T-SQL 迴圈/遞迴 CTE 快 5-10 倍,但啟動 CLR 執行環境有微小開銷(~微秒級)。 |
| 除錯 | VS 附加至 sqlservr.exe 進程,可對 CLR 代碼設中斷點、單步執行。 |
需要複雜字串/數學/加密/正則運算? ├─ 是 → 評估 T-SQL 能否用內建函數/CTV/應用層處理 │ ├─ 能 → 優先 T-SQL/應用層(維護成本低) │ └─ 不能/效能不足 → CLR 函數/程序 └─ 否 → 純 T-SQL 即可
CLR 整合讓 SQL Server 突破 T-SQL 表達限制,引入 .NET 生態的豐富基礎類別庫。關鍵在於謹慎評估必要性、嚴格權限控制、自動化部署管線。對於「字串分割排序」這類純運算需求,CLR 函數是優雅且高效的解決方案。