T-SQL編程 —— 用戶自定義函數(內嵌表值函數)


內嵌表值函數

接上 《T-SQL編程 —— 用戶自定義函數(標量函數)》

http://www.cnblogs.com/viusuangio/p/6212072.html

 

  內嵌表值函數可以用於實現參數化視圖(查詢),例如有一個查詢其定義語句如下:

1 use Student
2 GO
3 --查詢筆試成績幾個的同學
4 select s.stuno ,s.stuname,s.brithday,e.written,e.lab
5 from StuInfo s left outer join exam e
6 on s.stuno = e.stuno
7 where e.written >=60

  若希望設計更加通用的程序,讓用戶能夠指定查詢內容,可將 where e.written >= 60 替換為 where e.written >=@para, @para用於傳遞參數,但是視圖查詢不支持在wherea語句中指定搜索條件參數,為解決這樣的一個問題,可以使用內嵌值函數。

  內嵌表值函數的定義:

create function [owner_name.] function_name
([{@parameter_name [as] scalar_parameter_data_type [default]}[,n..]])
returns table [with encryption] [as]
return [(select_stmt)]

  其中各個選項的含義如下:

  • owner_name:數據庫所有者名
  • function_name:用戶定義函數名,函數名必須符合標識符規則,對其所有者來說,該用戶在數據庫中必須是唯一的。
  • @parameter_name:用戶定義函數的形參名, create function 語句中可以申明一個或多個參數,用@符號作為第一個字符來指定形參名 ,每個函數的參數局部作用於該函數。
  • scalar_parameter_data_type:參數的數據類型,可為系統支持的基本標量類型,不能為 timestamp 類型、用戶定義數據類型、非標量類型(如 cursor tabel)
  • default:指定默認值。
  • returns table:此句僅包含關鍵字table ,表示此函數返回一個表。
  • with 子句指出了創建函數的選項,如果指出了 encryption 參數,則創建的函數是被加密的,函數定義的文本將以不可讀的形式存儲在 syscomments 表中,任何人都不能查看該函數的定義,包括函數的創建者和系統管理員。
  • return [(select_stmt)]:內嵌表值函數的函數體僅有一個return語句,並通過參數 select_stmt 指定的 select 語句返回內嵌值。

  例如:在student數據庫(假設已經存在)創建一個查詢(一般是一個視圖),如果在此查詢的基礎上定義一個內嵌表值函數。

 1 /*創建視圖查詢,但不能帶參數(如下面注釋句)*/
 2 create view Veam as
 3 select s.stuno,s.stuname,s.brithday,e.written,e.lab
 4 from StuInfo s left outer join exam e
 5 on s.stuno = e.stuno
 6 --where writtrn >=60
 7 
 8 
 9 
10 /*改用內嵌表函數可以解決,傳入參數,返回帶參數的查詢*/
11 create function getExams(@written float)
12 returns table as
13 return(
14     select s.stuno,s.stuname,s.brithday,e.written,e.lab
15     from StuInfo s left outer join exam e
16     on s.stuno=e.stuno
17     where written >= @written
18 )

  內嵌表值函數的調用:

  內嵌表值函數只能通過 select 語句調用,內嵌表值函數調用的時候,可以僅僅只使用函數名。

  例如,調用 getExams()函數,查詢筆試成績大於等於70的記錄。

 

1 select * from dbo.getExams(70) 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM