在SQLServer 2005中編寫存儲過程
更新時間:2009年07月26日 22:08:43 作者:
在SQL Server 2000中,實際上只有一種創(chuàng)建存儲過程的方法:即T-SQL語句。之前的每個SQL Server版本都采用這個程序。
然而,在SQL Server 2005中,我們可以用.NET家族的語言——主要是VB.NET和C#來編寫存儲過程(以及方法、觸發(fā)器和其它組件)。讓我們來熟悉一下關(guān)于編寫存儲過程新方法的5個常見問題。它們是非常值得我們探討的。
1、為什么我們必須使用CLR模式來編寫存儲過程呢?
主要原因是速度。SQL CLR在很多方式下都運行較快:比如字符串處理,它比T-SQL運行快很多,并且對于錯誤的處理能力也更加強大。同時,由于CLR所提供的來執(zhí)行這些事務(wù)的框架都更為完善,因此任何需要與數(shù)據(jù)庫之外資源進(jìn)行事務(wù)交互的存儲過程——比如,文件系統(tǒng)或者Web服務(wù)——CLR SP都是表現(xiàn)最好的。
2、CLR最適合編寫哪些類型的存儲過程?
一般來說,在數(shù)據(jù)上執(zhí)行繁重計算而不是僅僅是查詢數(shù)據(jù)的SP最適合用CLR。如果一個CLR SP只是封裝一個復(fù)雜的SELECT語句,那么我們將無法看到顯著的性能增益,因為每次運行SP時,都必須驗證CLR中的SQL語句。事實上,它比僅將SELECT語句作為T-SQL SP處理表現(xiàn)還要差。
一個經(jīng)典的好方法是:如果需要執(zhí)行的SQL的行數(shù)很多,那么可以將SQL封裝在一個常規(guī)的SP上。如果想要在一個大的數(shù)據(jù)集上運行CLR風(fēng)格的處理,那么我們可以在CLR SP內(nèi)部調(diào)用一個常規(guī)的SP來獲取這個大的數(shù)據(jù)集。這樣,常規(guī)的SP會被預(yù)編譯,性能也會更好,同時數(shù)據(jù)轉(zhuǎn)換性能也會有所提高。
注意:這種情況是假定我們需要在數(shù)據(jù)層上進(jìn)行復(fù)雜的數(shù)據(jù)處理,而不是在顯示層上。事實上我們在編寫代碼之前就需要考慮這些問題。
3、是否應(yīng)該把現(xiàn)有的存儲過程轉(zhuǎn)換為CLR模式?
簡單而言,“要有好處才去做”。在這種情況下,可以為指定的存儲過程創(chuàng)建一個同等的CLR實現(xiàn)的版本,然后使用實際數(shù)據(jù)對兩種SP進(jìn)行測試。除非我們可以確定新的存儲過程:(a)按照預(yù)計的方式運行,(b)對性能有實際的提升,否則應(yīng)該繼續(xù)使用老的存儲過程。其實CLR跟其它的存儲過程一樣,沒什么奇特的。
4、在沒有開發(fā)IDE的情況下,可以創(chuàng)建CLR(Common Language Runtime)存儲過程嗎?
當(dāng)然,我們可以通過C#編譯手動實現(xiàn)這類開發(fā)。然而,使用Visual Studio或者類似的IDE可以更簡單,特別是當(dāng)我們在整個企業(yè)范圍內(nèi)轉(zhuǎn)換或?qū)崿F(xiàn)大量SP時。
5、轉(zhuǎn)換有多難?
很明顯,我們必須具備其中一種支持語言的知識,如VB.NET或者C#。事實上,SQL命令是“封裝”在CLR代碼中的,因此,只要我們知道如何使用它,那么在CLR重新實現(xiàn)現(xiàn)有的T-SQL是不難的。比較有難度的是如何使用這種語言來優(yōu)化我們正在做的工作,這個問題就不是幾個要點就可以歸納的。
1、為什么我們必須使用CLR模式來編寫存儲過程呢?
主要原因是速度。SQL CLR在很多方式下都運行較快:比如字符串處理,它比T-SQL運行快很多,并且對于錯誤的處理能力也更加強大。同時,由于CLR所提供的來執(zhí)行這些事務(wù)的框架都更為完善,因此任何需要與數(shù)據(jù)庫之外資源進(jìn)行事務(wù)交互的存儲過程——比如,文件系統(tǒng)或者Web服務(wù)——CLR SP都是表現(xiàn)最好的。
2、CLR最適合編寫哪些類型的存儲過程?
一般來說,在數(shù)據(jù)上執(zhí)行繁重計算而不是僅僅是查詢數(shù)據(jù)的SP最適合用CLR。如果一個CLR SP只是封裝一個復(fù)雜的SELECT語句,那么我們將無法看到顯著的性能增益,因為每次運行SP時,都必須驗證CLR中的SQL語句。事實上,它比僅將SELECT語句作為T-SQL SP處理表現(xiàn)還要差。
一個經(jīng)典的好方法是:如果需要執(zhí)行的SQL的行數(shù)很多,那么可以將SQL封裝在一個常規(guī)的SP上。如果想要在一個大的數(shù)據(jù)集上運行CLR風(fēng)格的處理,那么我們可以在CLR SP內(nèi)部調(diào)用一個常規(guī)的SP來獲取這個大的數(shù)據(jù)集。這樣,常規(guī)的SP會被預(yù)編譯,性能也會更好,同時數(shù)據(jù)轉(zhuǎn)換性能也會有所提高。
注意:這種情況是假定我們需要在數(shù)據(jù)層上進(jìn)行復(fù)雜的數(shù)據(jù)處理,而不是在顯示層上。事實上我們在編寫代碼之前就需要考慮這些問題。
3、是否應(yīng)該把現(xiàn)有的存儲過程轉(zhuǎn)換為CLR模式?
簡單而言,“要有好處才去做”。在這種情況下,可以為指定的存儲過程創(chuàng)建一個同等的CLR實現(xiàn)的版本,然后使用實際數(shù)據(jù)對兩種SP進(jìn)行測試。除非我們可以確定新的存儲過程:(a)按照預(yù)計的方式運行,(b)對性能有實際的提升,否則應(yīng)該繼續(xù)使用老的存儲過程。其實CLR跟其它的存儲過程一樣,沒什么奇特的。
4、在沒有開發(fā)IDE的情況下,可以創(chuàng)建CLR(Common Language Runtime)存儲過程嗎?
當(dāng)然,我們可以通過C#編譯手動實現(xiàn)這類開發(fā)。然而,使用Visual Studio或者類似的IDE可以更簡單,特別是當(dāng)我們在整個企業(yè)范圍內(nèi)轉(zhuǎn)換或?qū)崿F(xiàn)大量SP時。
5、轉(zhuǎn)換有多難?
很明顯,我們必須具備其中一種支持語言的知識,如VB.NET或者C#。事實上,SQL命令是“封裝”在CLR代碼中的,因此,只要我們知道如何使用它,那么在CLR重新實現(xiàn)現(xiàn)有的T-SQL是不難的。比較有難度的是如何使用這種語言來優(yōu)化我們正在做的工作,這個問題就不是幾個要點就可以歸納的。
您可能感興趣的文章:
- SqlServer 2000、2005分頁存儲過程整理
- sqlserver存儲過程語法詳解
- SqlServer獲取存儲過程返回值的實例
- sqlserver 各種判斷是否存在(表名、函數(shù)、存儲過程等)
- sqlserver 存儲過程帶事務(wù) 拼接id 返回值
- sqlserver 存儲過程動態(tài)參數(shù)調(diào)用實現(xiàn)代碼
- sqlserver 存儲過程分頁(按多條件排序)
- sqlserver 存儲過程分頁代碼
- sqlserver 常用存儲過程集錦
- sqlserver 通用分頁存儲過程
- SQLServer 2005 列所有存儲過程的語句
- 分頁 SQLServer存儲過程
- sql存儲過程幾個簡單例子
相關(guān)文章
SQL2005利用ROW_NUMBER() OVER實現(xiàn)分頁功能
SQL2005利用ROW_NUMBER() OVER實現(xiàn)分頁功能,需要的朋友可以參考下2012-12-12
Sql server 備份還原后出現(xiàn) 受限制用戶 問題
怎么解決Sql Server 2005數(shù)據(jù)庫備份還原后出現(xiàn)“受限制用戶”,這是大家在數(shù)據(jù)庫備份還原后經(jīng)常遇到的問題,我們今天就來探討下.2020-03-03
SQLServer無法打開用戶默認(rèn)數(shù)據(jù)庫 登錄失敗錯誤4064的解決方法
這篇文章主要介紹了SQLServer無法打開用戶默認(rèn)數(shù)據(jù)庫 登錄失敗錯誤4064的解決方法,需要的朋友可以參考下2015-01-01
SQLServer2005 XML數(shù)據(jù)操作代碼
在項目中經(jīng)常用XML文件,看看T-SQL程序設(shè)計發(fā)現(xiàn)SQLSERVER2005居然可以處理XML類型,而且還可以使用類似于Xpath的查詢語法查詢。2010-06-06
SQL2008中SQL應(yīng)用之-阻塞(Blocking)應(yīng)用分析
當(dāng)一個數(shù)據(jù)庫會話中的事務(wù)正鎖定一個或多個其他會話事務(wù)想要讀取或修改的資源時,會產(chǎn)生阻塞(Blocking)。2011-06-06
SQL Server 2005的cmd_shell組件的開啟方法
這篇文章介紹了SQL Server 2005的cmd_shell組件的開啟方法,有需要的朋友可以參考一下2013-09-09
SQL查詢?nèi)罩?查看數(shù)據(jù)庫歷史查詢記錄的方法
在查詢分析器中寫了半天的SQL,竟忘了保存,坑爹啊~想找回某段時間曾執(zhí)行過的一段SQL語句,怎么辦2011-10-10

