SQL內(nèi)嵌用戶定義函數(shù)的功能
SQL內(nèi)嵌用戶定義函數(shù)在我們使用SQL數(shù)據(jù)庫中,用途很廣泛。下面就為您詳細(xì)介紹一些SQL內(nèi)嵌用戶定義函數(shù)方面的知識(shí),供您參考。
SQL內(nèi)嵌用戶定義函數(shù)
SQL內(nèi)嵌用戶定義函數(shù)是返回 table 的用戶定義函數(shù)的子集。內(nèi)嵌函數(shù)可用于實(shí)現(xiàn)參數(shù)化視圖的功能。
請(qǐng)看下面的視圖:
- CREATE VIEW vw_CustomerNamesInWA AS
- SELECT CustomerID, CompanyName
- FROM Northwind.dbo.Customers
- WHERE Region = 'WA'
可創(chuàng)建更通用的版本 vw_CustomerNamesInRegion,方法是將 WHERE Region = 'WA' 替換為 WHERE Region = @RegionParameter 并讓用戶指定感興趣的查看區(qū)域。然而,視圖不支持在 WHERE 子句中指定的搜索條件的參數(shù)。
內(nèi)嵌用戶定義函數(shù)可用于支持在 WHERE 子句中指定的搜索條件的參數(shù)。下面是使用戶得以在其選擇中指定區(qū)域的函數(shù)示例:
- CREATE FUNCTION fn_CustomerNamesInRegion
- ( @RegionParameter nvarchar(30) )
- RETURNS table
- AS
- RETURN (
- SELECT CustomerID, CompanyName
- FROM Northwind.dbo.Customers
- WHERE Region = @RegionParameter
- )
- GO
- -- Example of calling the function for a specific region
- SELECT *
- FROM fn_CustomerNamesInRegion(N'WA')
- GO
內(nèi)嵌用戶定義函數(shù)遵從以下規(guī)則:
RETURNS 子句僅包含關(guān)鍵字 table。不必定義返回變量的格式,因?yàn)樗?RETURN 子句中的 SELECT 語句的結(jié)果集的格式設(shè)置。
function_body 不由 BEGIN 和 END 分隔。
RETURN 子句在括號(hào)中包含單個(gè) SELECT 語句。SELECT 語句的結(jié)果集構(gòu)成函數(shù)所返回的表。內(nèi)嵌函數(shù)中使用的 SELECT 語句受到與視圖中使用的 SELECT 語句相同的限制。
內(nèi)嵌函數(shù)還可用于提高索引視圖的能力。索引視圖自身不能在其 WHERE 子句搜索條件中使用參數(shù),針對(duì)特定用戶的需要調(diào)整存儲(chǔ)的結(jié)果集。然而,可定義存儲(chǔ)與視圖匹配的完整數(shù)據(jù)集的索引視圖,然后在包含允許用戶調(diào)整其結(jié)果的參數(shù)化搜索條件的索引視圖上定義內(nèi)嵌函數(shù)。如果視圖定義較復(fù)雜,則生成結(jié)果集所要執(zhí)行的大多數(shù)工作都涉及在視圖上創(chuàng)建聚集索引時(shí)生成聚合或聯(lián)接多個(gè)表。之后如果創(chuàng)建引用視圖的內(nèi)嵌函數(shù),則該函數(shù)可應(yīng)用用戶的參數(shù)化篩選,從結(jié)果集中提取由 CREATE INDEX 語句生成的特定行。在執(zhí)行 CREATE INDEX 時(shí)復(fù)雜的聚合和聯(lián)接進(jìn)行一次,隨后引用內(nèi)嵌函數(shù)的所有查詢都從簡(jiǎn)化的存儲(chǔ)結(jié)果集中篩選行。例如:
定義將所有銷售數(shù)據(jù)聚合到結(jié)果集的視圖 vw_QuarterlySales,該結(jié)果集按季度報(bào)告所有商店的匯總銷售數(shù)據(jù)。
在vw_QuarterlySales上創(chuàng)建聚集索引以具體化包含匯總數(shù)據(jù)的結(jié)果集。
創(chuàng)建篩選匯總數(shù)據(jù)的內(nèi)嵌函數(shù):
- CREATE FUNCTION fn_QuarterlySalesByStore
- (
- @StoreID int
- )
- RETURNS table
- AS
- RETURN (
- SELECT *
- FROM SalesDB.dbo.vw_QuarterlySales
- WHERE StoreID = @StoreID
- )
然后用戶可從內(nèi)嵌函數(shù)進(jìn)行選擇以獲得其特定商店的數(shù)據(jù):
- SELECT *
- FROM fn_QuarterlySalesByStore( 14432 )
滿足在第4步發(fā)出的查詢所需的大多數(shù)工作將按季度聚合銷售數(shù)據(jù)。該工作在第2步進(jìn)行一次。第4步中的每個(gè) SELECT 語句都使用函數(shù) fn_QuarterlySalesByStore 篩選出用戶的某個(gè)商店特有的聚合數(shù)據(jù)。
【編輯推薦】