SQL Server 2005 引入 CLR 整合,讓資料庫程式設計師能以 C#/VB.NET 撰寫預存程序、觸發器、UDF、UDA、UDT。專家分析其價值與邊界:
System.IO, System.Xml, System.Text.RegularExpressions, System.Security.Cryptography, System.Net 等直接可用。TRUSTWORTHY ON + dbo 擁有 EXTERNAL ACCESS ASSEMBLY 權限,| 場景 | 推薦技術 | 理由 |
|---|---|---|
| 複雜數學/統計/科學計算 | CLR (SAFE) | 演算法複雜、CPU 密集、T-SQL 難表達 |
| 字串解析、正則表達式、格式轉換 | CLR (SAFE) | .NET Regex/StringBuilder 效能與功能完勝 |
| 加密/雜湊/簽章驗證 | CLR (SAFE) | 調用 System.Security.Cryptography |
| 讀寫檔案、登錄、呼叫 Web Service | CLR (EXTERNAL_ACCESS) | 需外部資源存取,替代 xp_cmdshell |
| 簡單 CRUD、集合查詢、報表彙總 | T-SQL | 集合導向優化器最強、無 Context Switch 開銷 |
| 大量資料搬移、ETL | SSIS / BCP | 專用引擎、平行、緩衝、錯誤處理完善 |
| 高頻 OLTP 關鍵路徑 (微秒級) | T-SQL / In-Memory OLTP | 避免 Managed/Unmanaged 轉換延遲 |
將商業邏輯移入資料庫 (CLR 或 T-SQL) 會影響擴展性:SQL Server 垂直擴展 (Scale-up) 成本高、上限硬;應用層 水平擴展 (Scale-out) 彈性大、成本低。原則:資料密集型邏輯留資料庫 (就近計算);業務流程/規則留應用層。
-- 1. 建立簽署金鑰 (一次性)
CREATE ASYMMETRIC KEY CLR_Key FROM EXECUTABLE FILE = 'C:\Dll\MyAssembly.dll';
CREATE LOGIN CLR_Login FROM ASYMMETRIC KEY CLR_Key;
GRANT EXTERNAL ACCESS ASSEMBLY TO CLR_Login; -- 或 UNSAFE ASSEMBLY
-- 2. 部署組件 (不需 TRUSTWORTHY ON)
CREATE ASSEMBLY MyAssembly FROM 'C:\Dll\MyAssembly.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS;
-- 3. 建立托管物件
CREATE PROCEDURE usp_ReadConfig @path NVARCHAR(260)
AS EXTERNAL NAME MyAssembly.[MyNs.MyClass].ReadConfig;