資源描述:
《sqlserver用戶定義的函數(shù)與存儲過程視圖的區(qū)別》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、SQLServer用戶定義的函數(shù)與存儲過程視圖的區(qū)別用戶定義的函數(shù)(UDF)是準備好的代碼片段,它可以接受參數(shù),處理邏輯,然后返回某些數(shù)據(jù)。根據(jù)SQLServerBooksOnline,SQLServer?2000中的UDF可以接受從0到1024的任意個數(shù)的參數(shù),不過我必須承認,我還未嘗試將1024個參數(shù)傳遞到UDF中。UDF的另一個關(guān)鍵特征是返回一個值。取決于UDF的類型,調(diào)用例程可以使用這個值來繼續(xù)處理它的數(shù)據(jù)。因此,如果UDF返回單一值(標量值),調(diào)用例程就可以在任何能夠使用標準變量或文字值的地方使用這個值。如果UDF返回一個行
2、集,則調(diào)用例程可以循環(huán)訪問該行集,聯(lián)接到該行集,或簡單地從該行集中選擇列。雖然現(xiàn)在大多數(shù)編程語言已經(jīng)暫時支持函數(shù),但只有SQLServer2000引入了UDF。存儲過程和視圖在SQLServer中可用的時間遠早于UDF,但這些對象中的每一個在SQLServer開發(fā)中都有自己適當(dāng)?shù)奈恢?。存儲過程可以很好地用于處理復(fù)雜的SQL邏輯、保證和控制對數(shù)據(jù)的訪問,以及將行集返回到調(diào)用例程,無論此例程是基于VisualBasic?的程序,還是另一個Transact-SQL(T-SQL)批處理文件。與視圖不同,存儲過程是已編譯的,這使得它們成為用來表
3、示和處理頻繁運行的SQL語句的理想候選者。視圖可以很好地用于控制對數(shù)據(jù)的訪問,但它們的控制方式與存儲過程不同。視圖僅限于生成該視圖的基礎(chǔ)SELECT語句中的某些列和行。因而視圖常用于表示常用的SELECT語句,該語句可以聯(lián)接多個表、使用WHERE子句,以及公開特定的列。在聯(lián)接到其他表和視圖的SQL語句的FROM子句中經(jīng)常會發(fā)現(xiàn)視圖。在其核心部分,UDF既類似于視圖,也類似于存儲過程。像視圖一樣,UDF可以返回一個行集,該行集可用于JOIN中。因此,當(dāng)UDF返回一個行集并接受參數(shù)時,它像一個您可以聯(lián)接到的存儲過程、或者一個參數(shù)化的視圖。
4、但是,正如我將演示的,UDF可以做到這一點,甚至更多。有兩種主要的UDF類型:返回標量值的UDF和返回表值的UDF。在表值UDF中,您將找到返回內(nèi)聯(lián)表和多語句表的UDF(請參見圖1)。在以下部分中,我將對每種類型都加以關(guān)注。標量UDF返回標量值的UDF最類似于許多編程語言所引用的作為函數(shù)的內(nèi)容。它們返回由標量數(shù)據(jù)類型(例如,integer、varchar(n)、char(n)、money、datetime、bit,等等)組成的單一值。如果用戶定義的數(shù)據(jù)類型(UDDT)基于標量數(shù)據(jù)類型,UDF也可以返回這些數(shù)據(jù)類型。使用返回內(nèi)聯(lián)或多語句
5、表的UDF,可以通過表數(shù)據(jù)類型返回行集。然而,并非所有的數(shù)據(jù)類型都可以從UDF中返回。例如,UDF無法返回下列數(shù)據(jù)類型中任何一個的值:text、ntext、image、cursor、或timestamp。返回標量數(shù)據(jù)類型的UDF可以用于多種情況,以使代碼具有更好的可維護性、可重用性和更少的復(fù)雜性。當(dāng)T-SQL代碼的相同段在幾個地方(可能由幾個存儲過程和批SQL語句)使用時,這會非常有用。例如,假定一個應(yīng)用程序中的幾個部分都需要查找產(chǎn)品是否必須重新訂購。在每個需要此操作的地方,代碼可以檢查重新訂購等級,并將它與庫存量加訂購量的和相比較。
6、然而,因為這個代碼在幾個地方用到,所以可以改為使用UDF以減少代碼塊,并使得萬一需要更改時維護函數(shù)更加容易。這樣的UDF可能看起來像圖2中的代碼,并可以使用以下SQL語句進行調(diào)用:SELECTProductID,ReorderLevel,UnitsInStock,UnitsOnOrder,dbo.fnNeedToReorder(ReorderLevel,UnitsInStock,UnitsOnOrder)ASsNeedToReorderFROMProducts在圖2中,fnNeedToReorderUDF執(zhí)行計算并返回適當(dāng)?shù)闹?。這本來
7、可以通過CASE語句在SELECT子句內(nèi)完成,但如果改為使用UDF,代碼就會簡潔得多。而且更容易傳播到其他可能需要相同邏輯的地方。假定一個應(yīng)用程序中有幾個部分需要確定是否要重新訂購產(chǎn)品,那么圖2中的UDF確實變得有價值,因為它使得當(dāng)邏輯改變時應(yīng)用程序更容易維護。例如,重新訂購已經(jīng)終止的產(chǎn)品并不是很有意義。因此,通過更改UDF以說明這個業(yè)務(wù)規(guī)則,可以在一個地方更改此邏輯(請參見圖3)并使用下列代碼運行:SELECTProductID,ReorderLevel,UnitsInStock,UnitsOnOrder,dbo.fnNeedToR
8、eorder(ReorderLevel,UnitsInStock,UnitsOnOrder,Discontinued)ASsNeedToReorderFROMProducts請注意,UDF是使用由兩個部分(對象所有者和對