SQL Server 內建字串函數功能有限,若需在 T-SQL 中使用正則表達式驗證 Email、手機號等複雜格式,可透過 sp_OA* 系列系統預存程序呼叫 MSScriptControl.ScriptControl COM 元件執行 JavaScript 代碼。本文完整示範建立 isEmail 標量函數的過程,並討論權限、效能與安全性考量。
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
警告:啟用 Ole Automation 會擴大攻擊面,生產環境請嚴格評估風險,或改用 CLR 整合(SQL Server 2005+ 推薦方案)。
CREATE FUNCTION dbo.isEmail(@value VARCHAR(100))
RETURNS BIT
AS
BEGIN
DECLARE @object INT, @v BIT, @str VARCHAR(8000);
-- JavaScript 正則:簡易 Email 驗證(實務建議用更嚴謹 RFC 5322 相容版本)
SET @str = 'var reg=/^[\\w+\\.\\w-]*@([\\w-]+\\.)*\\w+[\\w-]*\\.([a-z]{2,3}|\\d+)$/i; reg.test("' + @value + '")';
-- 建立 ScriptControl COM 物件
EXEC sp_OACreate 'MSScriptControl.ScriptControl', @object OUTPUT;
EXEC sp_OASetProperty @object, 'Language', 'JScript'; -- 注意:此處用 JScript
EXEC sp_OAMethod @object, 'Eval', @v OUTPUT, @str; -- Eval 執行並回傳 Boolean
EXEC sp_OADestroy @object; -- 必須釋放,否則洩漏資源
RETURN @v;
END;
GO
SELECT * FROM (
SELECT 'aa.bb.com' AS email UNION ALL
SELECT 'aa@bb.com' UNION ALL
SELECT 'aa.bb@com' UNION ALL
SELECT 'aa@bb@com'
) a
WHERE dbo.isEmail(email) = 1;
/* 結果:
email
---------
aa@bb.com
*/
| 步驟 | 系統預存程序 | 說明 |
|---|---|---|
| 建立物件 | sp_OACreate | ProgID: MSScriptControl.ScriptControl,需註冊 msscript.ocx |
| 設定屬性 | sp_OASetProperty | Language = 'JScript'(非 'JavaScript') |
| 呼叫方法 | sp_OAMethod | 方法名 'Eval',輸出參數用 @v OUTPUT 接收 Boolean |
| 銷毀物件 | sp_OADestroy | 必須呼叫,否則記憶體/控制代碼洩漏 |
Regex.IsMatch 效能優於 COM 數量級,且型別安全、無權限擴大風險。MSXML2.XMLHTTP:爬取網頁資料(極不推薦,資料庫不應發 HTTP)。Word.Application:文件轉換、簡繁轉換(授權與穩定性極差)。結論:技術可行但生產環境強烈不建議。請優先採用 CLR 整合或應用層驗證,僅在舊系統無法重構、資料量極小的臨時腳本中作為權宜之計。