| 面向 | CLR 優勢 |
| 權限控管 | 程式碼存取安全性 (CAS):SAFE / EXTERNAL_ACCESS / UNSAFE 三級 |
| 可靠度 | 可驗證 Managed 代碼,型別安全,不會損壞 SQL Server 記憶體 |
| 資料存取 | 進程內 ADO.NET 自然共用連線與交易內容;XP 需迴路連線並手動綁定交易 |
| 效能 | SqlPipe 回傳結果優於 ODS API;支援新資料型別 (XML, MAX 型別) |
| 延展性 | SQL Server 管理 CLR 執行緒/記憶體/同步;XP 資源不可見、不可控 |
僅在「極高頻率 Managed/Unmanaged 交互」且「無資料存取」時,XP 原生碼效能略勝。綜合評估 CLR 為優先選擇。
程式碼部署位置:資料庫層 vs 中間層
- 資料驗證邏輯 → 資料庫層(封裝資料與規則,避免多點重複驗證)
- 大量資料輸入、少量結果輸出(如排程演算法) → 資料庫層(減少網路流量)
- 展示邏輯、商務流程編排 → 中間層
案例:Wagner-Whitin 動態規劃排程演算法,CLR 實作比 T-SRL 快數個數量級,且需大量多維陣列(T-SQL 不支援)。
進階主題實作範例
- SqlPipe:
SendResultsStart/Row/End 串流回傳任意結果集(RSS 解析範例)
- 資料表值函數 (TVF):實作
ISqlReader 介面,支援串流、可組合於 FROM 子句
- 字串拆分 TVF:
String.Split(';') → 串流回傳行集,供 INSERT ... SELECT * FROM dbo.Split(...) 使用
- 使用者定義彙總 (UDA):
PRODUCT() 乘積彙總,Accumulate/Merge/Terminate 模式,可用於 GROUP BY
- 使用者定義型別 (UDT):
UmAlQuraDateTime 伊斯蘭曆日期型別,封裝曆法轉換、日期運算、格式化,支援索引與比較
選擇指引總表
| 需求 | 推薦 |
| 需組合重用結果 | TVF |
| 外部資料來源 | CLR TVF / CLR Proc |
| 需副作用 (DML/交易) | Proc |
| 固定結構、單一結果集 | TVF 或 Proc |
| 變動結構、多結果集 | Proc |
| 串流處理大量結果 | CLR TVF |
結語
CLR 整合大幅擴展 SQL Server 程式設計能力,但不代表所有邏輯都應下沉資料庫層。架構師應在「資料就近處理」與「資料庫 CPU 保護」間取得平衡,善用 T-SQL 集合優勢、CLR 計算優勢、中間層編排優勢,構建高效、可維護的系統。
- 上一篇文章: SQL Server 安全隱患:sa 權限被盜可導致作業系統完整淪陷
- 下一篇文章: SQL Server 警示機制疑難排解完整檢查清單
Copyright ©
程式碼之家 All Rights Reserved