概述講解SQL Server 2005 CLR集成執(zhí)行功能
現(xiàn)在教大家如何使用 SQL Server 2005 CLR集成開(kāi)發(fā)。我們先來(lái)介紹一下 Microsoft .NET Framework 2.0 公共語(yǔ)言運(yùn)行庫(kù) (CLR),SQL Server 2005顯著地增強(qiáng)了數(shù)據(jù)庫(kù)編程模型的功能。它支持用任何 CLR 語(yǔ)言(特別是 Microsoft Visual C# .NET、Microsoft Visual Basic .NET 和 Microsoft Visual C++)編寫(xiě)過(guò)程、觸發(fā)器和函數(shù)。同時(shí),它還提供了擴(kuò)展數(shù)據(jù)庫(kù)系統(tǒng)中的類(lèi)型系統(tǒng)和聚合函數(shù)的功能,方法是允許應(yīng)用程序創(chuàng)建它們自己的數(shù)據(jù)類(lèi)型和聚合函數(shù)。
SQL Server 2005 CLR集成
下面簡(jiǎn)要概述了SQL Server 2005 CLR集成執(zhí)行功能,以及 Visual Studio 2005 最終發(fā)布版本如何支持這些功能。
注冊(cè)和執(zhí)行數(shù)據(jù)庫(kù)中的托管代碼包括以下步驟:
開(kāi)發(fā)人員將托管程序編寫(xiě)為一組類(lèi)定義。將 SQL Server 內(nèi)旨在用作存儲(chǔ)過(guò)程、函數(shù)或觸發(fā)器(下面統(tǒng)稱(chēng)為例程)的代碼編寫(xiě)為類(lèi)的 static(或 Microsoft Visual Basic .NET 中的 shared)方法。將旨在用作用戶(hù)定義的類(lèi)型和聚合的代碼編寫(xiě)為一個(gè)整類(lèi)。開(kāi)發(fā)人員編譯該程序并創(chuàng)建一個(gè)程序集。然后,將此程序集上載到 SQL Server 數(shù)據(jù)庫(kù),在其中使用 CREATE ASSEMBLY 數(shù)據(jù)定義語(yǔ)言 (DDL) 將它存儲(chǔ)到系統(tǒng)目錄。
接著,創(chuàng)建 TransacT-SQL 對(duì)象,例如,例程(函數(shù)、過(guò)程和觸發(fā)器)、類(lèi)型和聚合,并將其綁定到已經(jīng)上載的程序集中的入口點(diǎn)(對(duì)例程來(lái)說(shuō)是方法,對(duì)類(lèi)型和聚合來(lái)說(shuō)是類(lèi))。使用 CREATE PROCEDURE/FUNCTION/ TRIGGER/TYPE/AGGREGATE 語(yǔ)句來(lái)完成這一步。在創(chuàng)建了這些例程之后,應(yīng)用程序就可以像使用 T-SQL 例程一樣使用它們。例如,可以從 T-SQL 查詢(xún)中調(diào)用 CLR 函數(shù),從客戶(hù)端應(yīng)用程序或從 T-SQL 批處理中調(diào)用 CLR 過(guò)程,就好像它們是 T-SQL 過(guò)程一樣。
Visual Studio 2005 Beta 1 支持在 SQL Server 2005 中開(kāi)發(fā)、部署和調(diào)試托管代碼。有一種新的項(xiàng)目類(lèi)型(稱(chēng)為 SQL Server 項(xiàng)目),它允許開(kāi)發(fā)人員在 SQL Server 中開(kāi)發(fā)、部署和調(diào)試?yán)蹋ê瘮?shù)、過(guò)程和觸發(fā)器)、類(lèi)型和聚合。
構(gòu)建和部署
SQL Server 項(xiàng)目提供了代碼模板,這使得開(kāi)發(fā)人員能夠輕松地開(kāi)始為基于 CLR 的數(shù)據(jù)庫(kù)例程、類(lèi)型和聚合編寫(xiě)代碼。該項(xiàng)目還允許添加對(duì)數(shù)據(jù)庫(kù)中其他的程序集的引用。在構(gòu)建項(xiàng)目時(shí),可以將其編譯成一個(gè)程序集。部署此程序集可以將程序集的二進(jìn)制文件上載到與該項(xiàng)目相關(guān)聯(lián)的 SQL Server 數(shù)據(jù)庫(kù)中。部署操作還自動(dòng)創(chuàng)建在數(shù)據(jù)庫(kù)的程序集中定義的例程、類(lèi)型和聚合,方法是使用在代碼中定義的自定義屬性(SqlProcedure、SqlFunction 和 SqlTrigger 等等)。它還上載與該程序集相關(guān)聯(lián)的源代碼和 .pdb 文件(調(diào)試符號(hào))。
調(diào)試
對(duì)于任何平臺(tái)來(lái)說(shuō),調(diào)試都是開(kāi)發(fā)人員體驗(yàn)的基本部分。SQL Server 2005 和 Visual Studio 2005 為數(shù)據(jù)庫(kù)編程人員提供了這些功能。調(diào)試 SQL Server 2005 對(duì)象的關(guān)鍵部分在于其易于安裝和使用。調(diào)試到運(yùn)行 SQL Server 的計(jì)算機(jī)的連接在很大程度上同調(diào)試傳統(tǒng)操作系統(tǒng)中運(yùn)行的進(jìn)程的方式一樣。調(diào)試器的功能不會(huì)受到客戶(hù)端到服務(wù)器的連接類(lèi)型的影響。這樣就可以調(diào)試表格數(shù)據(jù)流 (TDS) 和 HTTP 連接。而且,還可以跨語(yǔ)言進(jìn)行無(wú)縫調(diào)試。因此,如果有一個(gè)調(diào)用 CLR 存儲(chǔ)過(guò)程的 T-SQL 存儲(chǔ)過(guò)程,調(diào)試會(huì)允許您從 T-SQL 過(guò)程進(jìn)入到 CLR 過(guò)程。
CLR 與 TransacT-SQL 區(qū)別
現(xiàn)在我們進(jìn)入本文的關(guān)鍵部分:對(duì) CLR 集成和 SQL Server 中支持的現(xiàn)有編程語(yǔ)言進(jìn)行比較。
TransacT-SQL (T-SQL) 是 SQL Server 支持的本機(jī)編程語(yǔ)言。和大多數(shù) SQL Server 版本一樣,它包含數(shù)據(jù)處理功能和數(shù)據(jù)定義功能。數(shù)據(jù)處理功能一般可以分為兩類(lèi):查詢(xún)語(yǔ)言(由 SELECT/INSERT/UPDATE/ DELETE 語(yǔ)句組成)和過(guò)程語(yǔ)言(WHILE、賦值、觸發(fā)器、光標(biāo)等)。一般來(lái)說(shuō),SQL Server 中的 CLR 支持為過(guò)程語(yǔ)言提供了 T-SQL 的替代方法。
即使在 SQL Server 中引入 CLR 支持以前,數(shù)據(jù)庫(kù)應(yīng)用程序應(yīng)該盡可能多地使用查詢(xún)語(yǔ)言,這始終被認(rèn)為是很重要的。數(shù)據(jù)庫(kù)應(yīng)用程序應(yīng)該利用面向集的查詢(xún)處理器,并且只在查詢(xún)語(yǔ)言無(wú)法表示邏輯時(shí)才轉(zhuǎn)向過(guò)程編程。對(duì)于 SQL Server 中的 CLR 支持,這仍然是正確的。不應(yīng)該使用 CLR 來(lái)編寫(xiě)可以用簡(jiǎn)單的 SELECT 語(yǔ)句表示的過(guò)程代碼。在 SQL Server 2005 中增加了許多重要的功能來(lái)提高T-SQL 查詢(xún)語(yǔ)言的表達(dá)能力。
遞歸查詢(xún):遍歷表中的遞歸層次的能力
分析函數(shù):RANK 和 ROW_NUMBER 允許排列結(jié)果集中的行
新的關(guān)聯(lián)操作:APPLY、PIVOT 和 UNPIVOT
試圖使用 CLR 功能的開(kāi)發(fā)人員應(yīng)該確保他們充分地利用查詢(xún)語(yǔ)言,包括 SQL Server 2005 中的擴(kuò)展在內(nèi)。對(duì)于在查詢(xún)語(yǔ)言中無(wú)法以聲明方式表示的邏輯,他們應(yīng)該考慮將 CLR 作為有效的替代辦法。
現(xiàn)在讓我們看一些方案,其中基于 CLR 的編程能夠補(bǔ)充 T-SQL 查詢(xún)語(yǔ)言的表達(dá)能力。通常,需要在查詢(xún)(可稱(chēng)為函數(shù))內(nèi)嵌入過(guò)程邏輯。這允許許多方案,例如:根據(jù)數(shù)據(jù)庫(kù)表中存儲(chǔ)的值,對(duì)每行進(jìn)行復(fù)雜的計(jì)算(必須用過(guò)程邏輯來(lái)表示)。這可以包括將這些計(jì)算的結(jié)果發(fā)送給客戶(hù)端,或者使用計(jì)算來(lái)過(guò)濾發(fā)送給客戶(hù)端的行集,如以下示例中所示:
- SELECT <complex-calculation>(<column-name>,...)
- FROM <table>
- WHERE <complex-calculation>(<column-name>,...) = ..
用過(guò)程邏輯來(lái)評(píng)估表格結(jié)果,然后在 SELECT 或 DML語(yǔ)句的 FROM 子句中進(jìn)行查詢(xún)。
SQL Server 2000 引入了支持這些方案的 T-SQL 函數(shù)(標(biāo)量和表值)。有了 SQL Server 2005,就可以用 CLR 語(yǔ)言更容易地編寫(xiě)這樣的函數(shù),并且會(huì)極大地提高它們的性能。之所以編寫(xiě)這些函數(shù)非常容易,是因?yàn)槭聦?shí)上編寫(xiě) CLR 代碼的開(kāi)發(fā)人員可以利用 .NET Framework API中存在的大量有用函數(shù)和類(lèi)。這個(gè)類(lèi)/函數(shù)庫(kù)比 TransacT-SQL 中支持的內(nèi)置函數(shù)要豐富得多。此外,CLR 編程語(yǔ)言提供了 T-SQL 中所沒(méi)有的豐富構(gòu)造(例如數(shù)組和列表等)。與 T-SQL(它是一種解釋語(yǔ)言)相比,CLR 編程語(yǔ)言之所以具有更好的性能,是因?yàn)橥泄艽a是已編譯的。對(duì)于涉及算術(shù)計(jì)算、字符串處理、條件邏輯等的操作,托管代碼的性能可能要優(yōu)于 T-SQL 一個(gè)數(shù)量級(jí)。
注對(duì)于函數(shù),幾乎沒(méi)有必要從函數(shù)中訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。外部查詢(xún)已經(jīng)從數(shù)據(jù)庫(kù)中檢索到數(shù)據(jù)值,并且將其作為參數(shù)傳遞給函數(shù)。這是 CLR 的優(yōu)勢(shì),在計(jì)算性任務(wù)上比 T-SQL 更勝一籌。
以上介紹SQL Server 2005 CLR集成,從 CLR 中訪(fǎng)問(wèn)數(shù)據(jù),現(xiàn)在讓我們從編程模型和性能這兩個(gè)方面,看看如何用 CLR 來(lái)編寫(xiě)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的業(yè)務(wù)邏輯。 編程模型 ,使用 T-SQL,只是在過(guò)程代碼內(nèi)部嵌入查詢(xún)語(yǔ)言語(yǔ)句 (SELECT/INSER)。
【編輯推薦】