CREATE FUNCTION dbo.regexReplace (
@source NVARCHAR(MAX),
@regexp VARCHAR(1000),
@replace VARCHAR(1000),
@globalReplace BIT = 1,
@ignoreCase BIT = 0
) RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @hr INT, @objRegExp INT, @result VARCHAR(5000);
EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT;
-- ... 設定 Pattern、Global、IgnoreCase ...
EXEC @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace;
EXEC @hr = sp_OADestroy @objRegExp;
RETURN @result;
END
**缺點**:需啟用 Ole Automation Procedures (安全風險)、效能差、不支援 64 位元、字串長度限制 8000 字元。
using System;
using System.Data.SqlTypes;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions
{
[SqlFunction]
public static SqlString RegexReplace(SqlString input, SqlString pattern, SqlString replacement,
SqlBoolean global, SqlBoolean ignoreCase)
{
if (input.IsNull) return SqlString.Null;
var options = RegexOptions.None;
if (ignoreCase.Value) options |= RegexOptions.IgnoreCase;
if (!global.Value) options |= RegexOptions.RightToLeft; // 單次替換技巧
var result = Regex.Replace(input.Value, pattern.Value, replacement.Value, options);
return new SqlString(result);
}
}
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;CREATE ASSEMBLY RegexUtils FROM 'C:\Path\RegexUtils.dll' WITH PERMISSION_SET = SAFE;CREATE FUNCTION dbo.RegexReplace(@input NVARCHAR(MAX), @pattern NVARCHAR(1000), @replacement NVARCHAR(1000), @global BIT = 1, @ignoreCase BIT = 0) RETURNS NVARCHAR(MAX) AS EXTERNAL NAME RegexUtils.UserDefinedFunctions.RegexReplace;-- 移除 HTML 標籤
SELECT dbo.RegexReplace('text', '<[^>]+>', '', 1, 1);
-- 結果: text
-- 標準化電話號碼
SELECT dbo.RegexReplace('Phone: (02) 1234-5678', '\D', '', 1, 0);
-- 結果: 0212345678
| 方案 | 10萬次調用耗時 | 安全性 | 支援長度 |
|---|---|---|---|
| VBScript.RegExp (sp_OA) | ~45 秒 | 低 (需 Ole Automation) | 8000 字元 |
| CLR Regex | ~0.8 秒 | 高 (SAFE 權限集) | 2 GB (MAX) |
簡單替換用 TRANSLATE、REPLACE、STRING_SPLIT 組合;複雜正則**首選 CLR**。
SAFE 足夠 (純計算),勿用 EXTERNAL_ACCESS 或 UNSAFERegex 物件或 RegexOptions.Compiled 提升熱路徑效能**棄用 sp_OA,擁抱 CLR,正則處理快 50 倍且安全合規。**