首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2005 CLR 整合開發白皮書:架構、效能比較與最佳實務

     編輯:關於SqlServer

CLR 整合概覽

SQL Server 2005 內建 .NET Framework 2.0 CLR,支援以 C#、VB.NET、C++ 編寫預存程序、觸發器、使用者定義函數 (UDF)、使用者定義型別 (UDT) 及使用者定義彙總 (UDA)。開發流程:

  1. 撰寫 Managed 類別庫,編譯為組件
  2. CREATE ASSEMBLY 註冊至資料庫
  3. CREATE PROCEDURE/FUNCTION/TYPE/AGGREGATE 繫結進入點
  4. 如同 T-SQL 物件般呼叫使用

Visual Studio 2005 提供「SQL Server 專案」範本,支援開發、部署、偵錯一站式體驗。

CLR vs T-SQL:核心比較

程式設計模型

  • T-SQL:靜態 SQL 嵌入程序碼,編譯期驗證語法
  • CLR:透過 SqlContext.GetCommand() 取得 SqlCommand,動態字串 SQL,執行期才驗證
  • CLR 優勢:可利用 .NET Framework 巨大類別庫(集合、正則、XML、加密等),程式結構豐富(陣列、泛型、例外處理)

效能特性

決策指引

  • 優先使用 集合導向 T-SQL(SELECT/INSERT/UPDATE/DELETE)
  • 無法用集合語法表達的邏輯 → 考慮 CLR
  • 單純封裝 DML → T-SQL
  • 需逐列處理且含複雜計算 → CLR
  • 大量資料存取 + 複雜計算 → 混合:CLR 呼叫 T-SQL 預存程序處理資料存取,CLR 負責計算

CLR vs 擴展預存程序 (XP)

情境建議理由
計算密集(算術、字串、邏輯)CLRManaged 代碼編譯執行,比 T-SQL 直譯快 10 倍以上
資料存取密集(大量 SELECT/INSERT/UPDATE)T-SQL進程內 ADO.NET 額外層級開銷;T-SQL 直接對查詢處理器
結果集串流回傳同等SqlPipe.SendResultsRow 與 T-SQL 隱含管道機制相當
單一 SQL 陳述式提交T-SQLCLR 額外封送開銷約 2 倍
游標式逐列處理 + 複雜邏輯CLRSqlDataReader 導航略慢,但列處理邏輯極快

僅在「極高頻率 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 伊斯蘭曆日期型別,封裝曆法轉換、日期運算、格式化,支援索引與比較

選擇指引總表

面向CLR 優勢
權限控管程式碼存取安全性 (CAS):SAFE / EXTERNAL_ACCESS / UNSAFE 三級
可靠度可驗證 Managed 代碼,型別安全,不會損壞 SQL Server 記憶體
資料存取進程內 ADO.NET 自然共用連線與交易內容;XP 需迴路連線並手動綁定交易
效能SqlPipe 回傳結果優於 ODS API;支援新資料型別 (XML, MAX 型別)
延展性SQL Server 管理 CLR 執行緒/記憶體/同步;XP 資源不可見、不可控

結語

CLR 整合大幅擴展 SQL Server 程式設計能力,但不代表所有邏輯都應下沉資料庫層。架構師應在「資料就近處理」與「資料庫 CPU 保護」間取得平衡,善用 T-SQL 集合優勢、CLR 計算優勢、中間層編排優勢,構建高效、可維護的系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
需求推薦
需組合重用結果TVF
外部資料來源CLR TVF / CLR Proc
需副作用 (DML/交易)Proc
固定結構、單一結果集TVF 或 Proc
變動結構、多結果集Proc
串流處理大量結果CLR TVF