內嵌使用者定義函數
內嵌使用者定義函數是返回 table 的使用者定義函數的子集。內嵌函數可用於實現參數化視圖的功能。
請看下面的視圖:
CREATE VIEW vw_CustomerNamesInWA AS
SELECT CustomerID, CompanyName
FROM Northwind.dbo.Customers
WHERE Region = 'WA'
可建立更通用的版本 vw_CustomerNamesInRegion,方法是將 WHERE Region = 'WA' 替換為 WHERE Region = @RegionParameter 並讓使用者指定感興趣的查看地區。然而,視圖不支援在 WHERE 子句中指定的搜尋條件的參數。
內嵌使用者定義函數可用於支援在 WHERE 子句中指定的搜尋條件的參數。下面是使使用者得以在其選擇中指定地區的函數樣本:
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
內嵌使用者定義函數遵從以下規則:
RETURNS 子句僅包含關鍵字 table。不必定義返回變數的格式,因為它由 RETURN 子句中的 SELECT 語句的結果集的格式設定。
function_body 不由 BEGIN 和 END 分隔。
RETURN 子句在括弧中包含單個 SELECT 語句。SELECT 語句的結果集構成函數所返回的表。內嵌函數中使用的 SELECT 語句受到與視圖中使用的 SELECT 語句相同的限制。
內嵌函數還可用於提高索引檢視表的能力。索引檢視表自身不能在其 WHERE 子句搜尋條件中使用參數,針對特定使用者的需要調整儲存的結果集。然而,可定義儲存與視圖匹配的完整資料集的索引檢視表,然後在包含允許使用者調整其結果的參數化搜尋條件的索引檢視表上定義內嵌函數。如果視圖定義較複雜,則產生結果集所要執行的大多數工作都涉及在視圖上建立叢集索引時產生彙總或聯結多個表。之後如果建立引用視圖的內嵌函數,則該函數可應用使用者的參數化篩選,從結果集中提取由 CREATE INDEX 語句產生的特定行。在執行 CREATE INDEX 時複雜的彙總和聯結進行一次,隨後引用內嵌函數的所有查詢都從簡化的儲存結果集中篩選行。例如:
定義將所有銷售資料彙總到結果集的視圖 vw_QuarterlySales,該結果集按季度報告所有商店的匯總銷售資料。
在 vw_QuarterlySales 上建立叢集索引以具體化包含摘要資料的結果集。
建立篩選摘要資料的內嵌函數:
CREATE FUNCTION fn_QuarterlySalesByStore
(
@StoreID int
)
RETURNS table
AS
RETURN (
SELECT *
FROM SalesDB.dbo.vw_QuarterlySales
WHERE StoreID = @StoreID
)
然後使用者可從內嵌函數進行選擇以獲得其特定商店的資料:
SELECT *
FROM fn_QuarterlySalesByStore( 14432 )
滿足在第 4 步發出的查詢所需的大多數工作將按季度彙總銷售資料。該工作在第 2 步進行一次。第 4 步中的每個 SELECT 語句都使用函數 fn_QuarterlySalesByStore 篩選出使用者的某個商店特有的彙總資料。