T-SQL 字串處理能力弱,缺乏原生正則表達式支援。SQL Server 2005+ 引入 CLR 整合,可用 C#/VB.NET 撰寫高效能字串處理函數並註冊到資料庫。
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;
public class CLR_FUNCTION
{
///
/// 依正則表達式分割字串,輸出每一比對結果為一列
/// 範例:輸入 '1,2,3,4,5,12,8',Pattern '\d{1,2}' → 輸出 1,2,3,4,5,12,8 各一列
///
[SqlFunction(
TableDefinition = "tmp_value nvarchar(max)",
FillRowMethodName = "SplitByRegex_FillRow"
)]
public static IEnumerable SplitStrByRegex(SqlString input, SqlString pattern)
{
var results = new List();
if (input.IsNull || pattern.IsNull) return results;
var matches = Regex.Matches(input.Value.Trim(), pattern.Value.Trim());
foreach (Match m in matches)
{
if (m.Success) results.Add(m.Value);
}
return results;
}
// FillRow 方法:將 IEnumerable 元素轉為 SqlString 輸出
public static void SplitByRegex_FillRow(object obj, out SqlString tmp)
{
tmp = new SqlString(obj.ToString());
}
}
Microsoft.SqlServer.Server (在 SQL Server 安裝目錄 SDK 資料夾)ClrRegex.dll)
-- 1. 啟用 CLR (執行個體層級)
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
-- 2. 建立組件 (需 SAFE/EXTERNAL_ACCESS/UNSAFE 權限)
CREATE ASSEMBLY ClrRegex
FROM 'C:\Deploy\ClrRegex.dll'
WITH PERMISSION_SET = SAFE;
-- 3. 建立函數對應
CREATE FUNCTION dbo.SplitByRegex (@input NVARCHAR(MAX), @pattern NVARCHAR(MAX))
RETURNS TABLE (tmp_value NVARCHAR(MAX))
AS EXTERNAL NAME ClrRegex.[CLR_FUNCTION].SplitStrByRegex;
SELECT * FROM dbo.SplitByRegex('1,2,3,4,5,12,8', '\d{1,2}');
-- 結果:1, 2, 3, 4, 5, 12, 8 (各一列)
| 權限集 | 能力 | 適用場景 |
|---|---|---|
| SAFE | 純運算、記憶體、無外部存取 | 正則運算、數學計算、字串處理 |
| EXTERNAL_ACCESS | 檔案、網路、登錄、環境變數 | 讀取外部設定檔、呼叫 Web API |
| UNSAFE | 非受控程式碼、P/Invoke、靜態變數 | 極少用,需 sysadmin 建立 |
SqlDataReader 流式處理而非記憶體集合