SQL內嵌用戶定義函數的功能

作者: 佚名  發布時間: 2010-11-18 22:10  閱讀: 1601 次  推薦: 0   原文鏈接   [收藏]  
摘要:內嵌函數可用于實現參數化視圖的功能,下面就讓我們一起來了解一下SQL內嵌用戶定義函數的使用,如果您您感興趣的話,不妨一看。

  SQL內嵌用戶定義函數在我們使用SQL數據庫中,用途很廣泛。下面就為您詳細介紹一些SQL內嵌用戶定義函數方面的知識,供您參考。

  SQL內嵌用戶定義函數
  SQL內嵌用戶定義函數是返回 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 篩選出用戶的某個商店特有的聚合數據。

0
0
 
標簽:SQL 函數
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()