簡介 Microsoft 通過宿主 Microsoft
NET Framework
公共語言運行庫 (CLR)
SQL Server
顯著地增強了數據庫編程模型的功能
它支持用任何 CLR 語言(特別是 Microsoft Visual C#
NET
Microsoft Visual Basic
NET 和 Microsoft Visual C++)編寫過程
觸發器和函數
同時
它還提供了擴展數據庫系統中的類型系統和聚合函數的功能
方法是允許應用程序創建它們自己的數據類型和聚合函數
本白皮書從數據庫應用程序開發人員的角度描述了如何最有效地利用這項技術
它還將 CLR 與 SQL Server 中支持的現有編程語言(即 TransacT
SQL (T
SQL) 和擴展存儲過程 (XP))進行了比較
本白皮書不打算提供這些功能的基本參考資料
SQL Server
Beta
Books Online 對其進行了詳細介紹
本白皮書的目標讀者包括數據庫應用程序開發人員
架構師和數據庫管理員
本白皮書假設讀者熟悉基於
NET Framework 的編程和數據庫編程
CLR 集成概述 下面簡要概述了 CLR 集成執行的 SQL Server 功能
以及 Visual Studio
最終發布版本如何支持這些功能
注冊和執行數據庫中的托管代碼包括以下步驟
開發人員將托管程序編寫為一組類定義
將 SQL Server 內旨在用作存儲過程
函數或觸發器(下面統稱為例程)的代碼編寫為類的 static(或 Microsoft Visual Basic
NET 中的 shared)方法
將旨在用作用戶定義的類型和聚合的代碼編寫為一個整類
開發人員編譯該程序並創建一個程序集
然後
將此程序集上載到 SQL Server 數據庫
在其中使用 CREATE ASSEMBLY 數據定義語言 (DDL) 將它存儲到系統目錄
接著
創建 TransacT
SQL 對象
例如
例程(函數
過程和觸發器)
類型和聚合
並將其綁定到已經上載的程序集中的入口點(對例程來說是方法
對類型和聚合來說是類)
使用 CREATE PROCEDURE/FUNCTION/ TRIGGER/TYPE/AGGREGATE 語句來完成這一步
在創建了這些例程之後
應用程序就可以像使用 T
SQL 例程一樣使用它們
例如
可以從 T
SQL 查詢中調用 CLR 函數
從客戶端應用程序或從 T
SQL 批處理中調用 CLR 過程
就好像它們是 T
SQL 過程一樣
Visual Studio
Beta
支持在 SQL Server
中開發
部署和調試托管代碼
有一種新的項目類型(稱為 SQL Server 項目)
它允許開發人員在 SQL Server 中開發
部署和調試例程(函數
過程和觸發器)
類型和聚合
構建和部署
SQL Server 項目提供了代碼模板
這使得開發人員能夠輕松地開始為基於 CLR 的數據庫例程
類型和聚合編寫代碼
該項目還允許添加對數據庫中其他的程序集的引用
在構建項目時
可以將其編譯成一個程序集
部署此程序集可以將程序集的二進制文件上載到與該項目相關聯的 SQL Server 數據庫中
部署操作還自動創建在數據庫的程序集中定義的例程
類型和聚合
方法是使用在代碼中定義的自定義屬性(SqlProcedure
SqlFunction 和 SqlTrigger 等等)
它還上載與該程序集相關聯的源代碼和
pdb 文件(調試符號)
調試
對於任何平台來說
調試都是開發人員體驗的基本部分
SQL Server
和 Visual Studio
為數據庫編程人員提供了這些功能
調試 SQL Server
對象的關鍵部分在於其易於安裝和使用
調試到運行 SQL Server 的計算機的連接在很大程度上同調試傳統操作系統中運行的進程的方式一樣
調試器的功能不會受到客戶端到服務器的連接類型的影響
這樣就可以調試表格數據流 (TDS) 和 HTTP 連接
而且
還可以跨語言進行無縫調試
因此
如果有一個調用 CLR 存儲過程的 T
SQL 存儲過程
調試會允許您從 T
SQL 過程進入到 CLR 過程
CLR 與 TransacTSQL 現在我們進入本文的關鍵部分
對 CLR 集成和 SQL Server 中支持的現有編程語言進行比較
TransacT
SQL (T
SQL) 是 SQL Server 支持的本機編程語言
和大多數 SQL Server 版本一樣
它包含數據處理功能和數據定義功能
數據處理功能一般可以分為兩類
查詢語言(由 SELECT/INSERT/UPDATE/ DELETE 語句組成)和過程語言(WHILE
賦值
觸發器
光標等)
一般來說
SQL Server 中的 CLR 支持為過程語言提供了 T
SQL 的替代方法
即使在 SQL Server 中引入 CLR 支持以前
數據庫應用程序應該盡可能多地使用查詢語言
這始終被認為是很重要的
數據庫應用程序應該利用面向集的查詢處理器
並且只在查詢語言無法表示邏輯時才轉向過程編程
對於 SQL Server 中的 CLR 支持
這仍然是正確的
不應該使用 CLR 來編寫可以用簡單的 SELECT 語句表示的過程代碼
在 SQL Server
中增加了許多重要的功能來提高T
SQL 查詢語言的表達能力
遞歸查詢
遍歷表中的遞歸層次的能力
分析函數
RANK 和 ROW_NUMBER 允許排列結果集中的行
新的關聯操作
APPLY
PIVOT 和 UNPIVOT
試圖使用 CLR 功能的開發人員應該確保他們充分地利用查詢語言
包括 SQL Server
中的擴展在內
對於在查詢語言中無法以聲明方式表示的邏輯
他們應該考慮將 CLR 作為有效的替代辦法
現在讓我們看一些方案
其中基於 CLR 的編程能夠補充 T
SQL 查詢語言的表達能力
通常
需要在查詢(可稱為函數)內嵌入過程邏輯
這允許許多方案
例如
根據數據庫表中存儲的值
對每行進行復雜的計算(必須用過程邏輯來表示)
這可以包括將這些計算的結果發送給客戶端
或者使用計算來過濾發送給客戶端的行集
如以下示例中所示
SELECT <complex
calculation>(<column
name>
)
FROM <table>
WHERE <complex
calculation>(<column
name>
) =
使用過程邏輯來評估表格結果
然後在 SELECT 或 DML語句的 FROM 子句中進行查詢
SQL Server
引入了支持這些方案的 T
SQL 函數(標量和表值)
有了 SQL Server
就可以用 CLR 語言更容易地編寫這樣的函數
並且會極大地提高它們的性能
之所以編寫這些函數非常容易
是因為事實上編寫 CLR 代碼的開發人員可以利用
NET Framework API中存在的大量有用函數和類
這個類/函數庫比 TransacT
SQL 中支持的內置函數要豐富得多
此外
CLR 編程語言提供了 T
SQL 中所沒有的豐富構造(例如數組和列表等)
與 T
SQL(它是一種解釋語言)相比
CLR 編程語言之所以具有更好的性能
是因為托管代碼是已編譯的
對於涉及算術計算
字符串處理
條件邏輯等的操作
托管代碼的性能可能要優於 T
SQL 一個數量級
注對於函數
幾乎沒有必要從函數中訪問數據庫
外部查詢已經從數據庫中檢索到數據值
並且將其作為參數傳遞給函數
這是 CLR 的優勢
在計算性任務上比 T
SQL 更勝一籌
從 CLR 中訪問數據
現在讓我們從編程模型和性能這兩個方面
看看如何用 CLR 來編寫訪問數據庫的業務邏輯
編程模型
使用 T
SQL
只是在過程代碼內部嵌入查詢語言語句 (SELECT/INSERT/UPDATE/ DELETE)
通過托管代碼
可以使用 SQL Server 托管提供程序來實現 Microsoft ADO
NET 數據訪問 API(也稱為 in
proc ADO
NET)
使用這種方法
可以將查詢語言語句(SELECT 和 DML 語句)作為動態字符串嵌入
並且將其作為參數傳遞給 ADO
NET API
與 T
SQL 的靜態方法相比
過程代碼內嵌入的 SQL 語句的基於動態 API 的特性是它們在編程模型上的主要區別
不利的是
in
proc ADO
NET 模型會產生比 T
SQL 更冗長的代碼
此外
因為 SQL 語句是動態字符串
所以在執行之前不在語法或語義上進行編譯和驗證
有利的是
帶有 ADO
NET 的數據庫編程模型與客戶端或中間層中使用的模型相似
因而更容易在各層之間移動代碼和利用現有的技術
此外
在基於 T
SQL 和基於 CLR 的編程模型中使用的都是同一 SQL 查詢語言
不同之處在於過程部分
注意到這一點是非常重要的
性能
正如已經提到的
在談及過程代碼
計算等方面時
與 T
SQL 相比
托管代碼在性能方面具有決定性的優勢
然而
對於數據訪問方面
T
SQL 在性能方面通常會更好
因此
通用規則是用 CLR 編寫計算和邏輯密集的代碼要比數據訪問密集的代碼好
不過這值得更詳細地考慮
讓我們看看數據訪問編程中的一些典型的基元和模式
以及在這些情況下如何使用 ADO
NET 進行 T
SQL 和托管編程
將結果發送到客戶端
這包括將一組行發送到客戶端
而沒有在服務器中
消費
它們(即沒有在例程內導航行)
使用 T
SQL
只需在 T
SQL proc 中嵌入一個 SELECT 語句就可以將 SELECT 產生的行發送到客戶端
通過托管代碼
可以使用 SqlPipe 對象將結果發送到客戶端
T
SQL 和 in
proc ADO
NET 平台在這種情況下的作用是一樣的
提交 SQL 語句
這包括來自過程代碼的 SQL 語句的執行往返
在這種情況下
T
SQL 具有很大的優勢(比 in
proc ADO
NET 快兩倍多)
此處需要重點注意的是
之所以在 CLR 中出現性能降低
是因為增加了額外的代碼層
包括將來自托管代碼的 T
SQL 語句提交給原生 SQL 代碼
在將該語句提交給查詢處理器之後
基於語句源(T
SQL 或 in
proc ADO
NET)的性能方面就沒有什麼不同了
注典型的數據訪問密集的存儲過程可能涉及提交一系列的 SQL 語句
如果 SQL 語句簡單
並且不需要花費大量的時間執行
則來自托管代碼的調用開銷可能占用大部分
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22080.html