內嵌表值函數
接上 《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)