SQL之用戶自定義函數

關于SQL Server用戶自定義的函數,有標量函數、表值函數(內聯表值函數、多語句表值函數)兩種。

題外話,可能有部分朋友不知道SQL Serve用戶自定義的函數應該是寫在哪里,這里簡單提示一下,在Microsoft SQL Server Managerment Studio里面,展開具體需要創建SQL Server用戶自定義函數的數據庫(即每個用戶自定義函數只針對具體的一個數據庫有用),然后找到可編程性選項,再展開找到函數選項,在具體的函數選項里面可參照下圖的方式鼠標右鍵選擇來添加。

?

標量函數

?

所謂標量函數簡單點來講就是返回的結果只是一個標量,對于我來講,返回的結果就是一種類型的一個值。

寫法如下:

復制代碼
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date, ,>
-- Description:    <Description, ,>
-- =============================================
CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName> 
(-- Add the parameters for the function here<@Param1, sysname, @p1> <Data_Type_For_Param1, , int>
)
RETURNS <Function_Data_Type, ,int>
AS
BEGIN-- Declare the return variable hereDECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>-- Add the T-SQL statements to compute the return value hereSELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1>-- Return the result of the functionRETURN <@ResultVar, sysname, @Result>END
復制代碼

例子:

復制代碼
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date, ,>
-- Description:    <Description, ,>
-- =============================================
CREATE FUNCTION GetSum
(@firstNum int,@secondNum int ) RETURNS int AS BEGIN-- Declare the return variable hereDECLARE @result int-- Add the T-SQL statements to compute the return value hereSELECT @result=@firstNum+@secondNum-- Return the result of the functionRETURN @resultEND GO
復制代碼

?題外話:我們來看看上面的寫法,對于SQL Server來講,我們聲明一個變量的方式是用@變量名,而且相對于編程來講,SQL Server聲明的方式跟我們開了個玩笑,是先變量后面才是類型。對于需要傳參跟不需要傳參的方式,其實跟我們編程的方式一樣。有參數則是如下方式:

CREATE FUNCTION GetSum
(@firstNum int,@secondNum int
)

如果沒有參數,則只要保留括號即可。跟我們理解的函數寫法一致。

CREATE FUNCTION GetSum
(
)

對于返回方式,這跟我們編程的方式又不大一樣。SQL Server函數的返回類型并不放在函數名前面,而是函數名括號的后面。而且函數的返回類型需要用到返回關鍵字RETURNS,而不是RETURN

對于函數來講,當然也會有所謂的函數體。標量函數也一樣。它的函數體是包含在:

AS
BEGIN-- 函數體
END

對于需要在函數體里面聲明變量的話,則需要使用到DECLARE關鍵字進行聲明。函數體內的返回才是關鍵字RETURN。?

好了,標量函數的例子也舉完了,要存到數據庫里面,還需要點擊Microsoft SQL Server Management Studio工具里的執行操作。這樣之后,就可以在查詢窗口里面跟查詢表數據一樣來查詢結果了。

使用方式好懂吧,但是需要注意的是[dbo]這個對象名在不能省,[GetSum]函數后面可也別少了()。說來也奇怪,對于表值函數來說,對象名[dbo]倒是不寫也可以正確執行。

select [dbo].[GetSum]()

?

內聯表值函數

?

?相對于標量函數只返回一個標量值,內聯表值函數返回的是表數據。當然羅,表數據就是Table類型。

寫法如下:

復制代碼
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName> 
(    -- Add the parameters for the function here<@param1, sysname, @p1> <Data_Type_For_Param1, , int>, <@param2, sysname, @p2> <Data_Type_For_Param2, , char>
)
RETURNS TABLE 
AS
RETURN 
(-- Add the SELECT statement with parameter references hereSELECT 0
)
GO
復制代碼

例子:

復制代碼
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
CREATE FUNCTION [GetMoreThanSalary]
(    @salary int
)
RETURNS TABLE 
AS
RETURN 
(SELECT [FName],[FCity],[FAge],[FSalary] FROM [Demo].[dbo].[T_Person] Where [FSalary] > @salary
)
GO
復制代碼

題外話:標量函數上面提過的內容,這里就不重復了。內聯表函數返回的表結構由函數體內的SELECT語句來決定。

對于標量函數來講,函數體是包含在如下結構中。

AS
BEGIN-- 函數體
END

但是對于內聯表值函數來講,函數體的結構則是如下的方式。內聯表值函數只執行一條SQL語句后返回Table結果。

AS
RETURN-- 函數體
END

執行表值函數的方式如下:

select [FName],[FCity],[FAge],[FSalary] from [dbo].[GetMoreThanSalary](8000)

可以看得出,這種執行方式就跟普通表的執行方式一樣了。表值函數其實相當于存儲在內存空間里面的一張虛擬表。

?

多語句表值函數

?

?多語句表值函數跟內聯表值函數都是表值函數,它們返回的結果都是Table類型。多語句表值函數顧名思義,就是可以通過多條語句來創建Table類型的數據。這里不同于內聯表值函數,內聯表值函數的返回結果是由函數體內的SELECT語句來決定。而多語句表值函數,則是需要指定具體的Table類型的結構。也就是說返回的Table,已經定義好要哪些字段返回。所以它能夠支持多條語句的執行來創建Table數據。

寫法如下:

復制代碼
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
CREATE FUNCTION <Table_Function_Name, sysname, FunctionName> 
(-- Add the parameters for the function here<@param1, sysname, @p1> <data_type_for_param1, , int>, <@param2, sysname, @p2> <data_type_for_param2, , char>
)
RETURNS 
<@Table_Variable_Name, sysname, @Table_Var> TABLE 
(-- Add the column definitions for the TABLE variable here<Column_1, sysname, c1> <Data_Type_For_Column1, , int>, <Column_2, sysname, c2> <Data_Type_For_Column2, , int>
)
AS
BEGIN-- Fill the table variable with the rows for your result setRETURN 
END
GO
復制代碼

例子:

復制代碼
-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
ALTER FUNCTION DemoFun
()
RETURNS 
@result TABLE 
(name nvarchar(20),city nvarchar(20),age int,salary int
)
AS
BEGIN-- Fill the table variable with the rows for your result setinsert into @result(name, city, age, salary)select FName,FCity,FAge,FSalary from dbo.T_Person where FSalary>8000insert into @result(name, city, age, salary) values('測試','China', 1, 0)RETURN 
END
GO
復制代碼

題外話:可以看得出,多語句表值函數的返回結果是定義好表結構的虛擬表。這又跟標量函數一樣了吧,只不過標量函數是返回一種類型的標量值而已。而且在多語句表值函數里面,你也會發現最后一句是RETURN。告訴執行程序,多語句表值函數已經執行完成。函數體結構跟標量函數的結構一樣。對于類型放在變量后面這種方式確實需要好好轉換一下觀念。

復制代碼
RETURNS 
<@Table_Variable_Name, sysname, @Table_Var> TABLE 
(-- Add the column definitions for the TABLE variable here<Column_1, sysname, c1> <Data_Type_For_Column1, , int>, <Column_2, sysname, c2> <Data_Type_For_Column2, , int>
)
復制代碼

內容倒是不多,但是要熟練使用的話,還是需要在項目中多加使用才行。網上有一些網友總結出來的常用自定義函數大家可以收集積累,就像做項目一樣,好的方法要形成所謂的開發庫,幫助我們在下一個項目中復用。節省我們的開發時間,提高我們的工作效率。

至此,本文完。

?

?

參考:http://www.cnblogs.com/csdbfans/p/3514538.html

轉載于:https://www.cnblogs.com/haore147/p/3902988.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260142.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260142.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260142.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

hdoj3351-stack

Problem DescriptionI’m out of stories. For years I’ve been writing stories, some rather silly, just to make simple problems look difficult and complex problems look easy. But, alas, not for this one.You’re given a non empty string made in its entirety f…

vb語言程序設計_如果編程語言難度決定頭發濃度,學這語言的可能要光頭了

對于程序員來說&#xff0c;頭發真的比什么都重要&#xff0c;甚至很多程序員&#xff0c;大量的人民幣都花在了后續植發上。甚至網上還流行這么一句話&#xff0c;你發際線越高&#xff0c;編程能力越高&#xff0c;那對于程序員來說&#xff0c;那么多語言&#xff0c;到底哪…

oracle同義詞很慢,通過問題長知識----ORACLE同義詞

現象&#xff1a;create table JBPM_JOB時出錯&#xff0c;提示name is used by existing object而drop table 的時候&#xff0c;卻報table or view does not exist.這是一個很矛盾的現象。排查&#xff1a;select * from user_objects where OBJECT_NAME ‘JBPM_JOB’—注意字…

C#獲取程序集的版本號和最后編譯時間

C#獲取程序集的版本號&#xff1a;string ver System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); C#中如何將記錄項目的最后編譯時間&#xff1a;在實際的軟件開發工作中&#xff0c;我們通常需要記錄某個工程的最后編譯時間&#xff0c;原來…

無刷新上傳Excel后利用JQuery AJAX 顯示進度條的實現方式

1、前臺上傳頁面代碼 <div class"clearfix mywebsite-nodata"><div id"show"><form action"<?site_url(user/upload)?>" target"ifmupload" id"myform" method"post" accept-charset"…

怎么理解python語言_Python語言入門1-理解Python語言

本文主要向大家介紹了Python語言入門的理解Python語言&#xff0c;通過具體的內容向大家展現&#xff0c;希望對大家學習Python語言入門有所幫助。python是解釋型的腳本語言解釋型語言與C/C等編譯型語言相比&#xff0c;python語言的程序并不是首先編譯成二進制機器碼后運行&am…

SD Card Formatter for Mac Download

https://www.sdcard.org/downloads/formatter_4/eula_mac/ SDFormatter Mac版是一款Mac OS平臺上的sd卡修復工具&#xff0c;SDFormatter是一款比較好用的SD卡格式化工具&#xff0c;能夠格式化SD存儲卡和SDHC記憶Card&#xff08;SD/SDHC 存儲卡&#xff09;&#xff0c;使用遵…

linux刪除用戶oracle用戶名,linux添加用戶useradd 刪除用戶userdel

1.作用useradd或adduser命令用來建立用戶帳號和創建用戶的起始目錄&#xff0c;使用權限是超級用戶。2.格式useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name3.主要參數-c&#xff1a;加上備注文字&#xff0c…

Asp.net創建偽靜態頁面

下面是我研究了好幾天和同事一起才研究出來的&#xff0c;原創。 1偽靜態的定義&#xff1a; 偽靜態是相對真實靜態來講的&#xff0c;通常我們為了增強搜索引擎的友好面&#xff0c;都將文章內容生成靜態頁面&#xff0c;但是有的朋友為了實時的顯示一些信息。或者還想運用動態…

Spring 管理Bean(獲取Bean,初始化bean事件,自動匹配ByName······等)

1.實例化spring容器 和 從容器獲取Bean對象 實例化Spring容器常用的兩種方式&#xff1a; 方法一: 在類路徑下尋找配置文件來實例化容器 [推薦使用] ApplicationContext ctx new ClassPathXmlApplicationContext(new String[]{"beans.xml"}); 方法二: 在文件系統路徑…

directoryinfo 讀取 映射磁盤_LoaRunner性能測試系統學習教程:磁盤監控(5)

上期我們講到LoaRunner性能測試內存監控&#xff0c;這期我們講LoaRunner性能測試磁盤監控。磁盤監控在介紹磁盤監控前&#xff0c;先介紹固定磁盤存儲管理的性能&#xff0c;固定磁盤存儲器的結構層次如圖所示。每個單獨的磁盤驅動器稱為一個物理卷&#xff08;PV&#xff09;…

Eclipse新建web項目正常啟動tomcat不報錯,但不能訪問項目的解決方法

原因: 雖然我手動添加了自己下載的tomcat,但是由于在Eclipse中創建Server時&#xff0c;“Server Locations”選項采用的時默認配置&#xff0c;即"Use workspace metadata(does not modify tomcat installation ),這意味著該Server不會改變TOMCAT的安裝及部署目錄&#…

oracle10g執行insert,oracle 10g 增強審計。表insert 及bind values

oracle 10g之前&#xff0c;可以審計對表的操作&#xff0c;但不能記錄操作時的各個列的值。在10g中&#xff0c;已經可以審核并監控到具體的sql語句及內容了。要求10g以后的版本。alter system set audit_traildb_extended scopespfile;[more]示例&#xff1b;SQL> show us…

點擊按鈕 變換圖片

<html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>變換圖片</title><script type"text/javascript">function chan…

[鄰接表] 學習鄰接表的表示方法+BFS

算法導論上面的偽代碼實現哦&#xff0c;沒啥技術&#xff0c;不過這個鄰接表表示法&#xff08;figo大神教的&#xff09;很nice。 簡單說一下&#xff0c;head里面是放著自己節點后面鏈的最后一個元素在邊池中的位置&#xff0c;邊池里面成一個一個鏈狀&#xff0c;像并查集&…

wordpress漏洞_WordPress XSS漏洞可能導致遠程執行代碼(RCE)

原作者&#xff1a; Ziyahan Albeniz在2019年3月13日&#xff0c;專注于靜態代碼分析軟件的RIPS科技公司發布了他們在所有版本的WordPress 5.1.1中發現的跨站點腳本(XSS)漏洞的詳細信息。該漏洞已在不同類別的各種網站上公布。有些人將其歸類為跨站點請求偽造(CSRF)漏洞&#x…

centOS 6環境下安裝R-3.3.2及Rstudio-server

【編譯R語言】 1、下載安裝R語言 # 下載R-3.3.2 $ wget https://cran.r-project.org/src/base/R-3/R-3.3.2.tar.gz# 安裝R-3.3.2 $ tar -zxvf R-3.3.2.tar.gz $ cd R-3.3.2# 安裝到默認目錄下 --perfix/opt/R 或 /usr/local/lib64/R $ ./configure --prefix/opt/R --with-re…

DJ輪回舞曲網下載教程

該網站網址為&#xff1a;http://www.92cc.com/ 昨天有網友問我這個網站能不能下載。我告訴他&#xff0c;只要能在線試聽的就能下載 于是今天出個臨時教程 教大家如何獲取試聽的音樂URL。 第一步找到試聽的網址&#xff0c;如&#xff1a; http://www.92cc.com/p97206.html 第…

【DP】【Asia - Harbin - 2010/2011】【Permutation Counting】

【題目描述】Given a permutation a1, a2,...aN of {1, 2,..., N}, we define its E-value as the amount of elements where ai > i. For example, the E-value of permutation {1, 3, 2, 4} is 1, while the E-value of {4, 3, 2, 1} is 2. You are requested to find h…

三豐三坐標編程基本步驟_三豐三坐標CRYSTA APEX S776

日本三豐MITUTOYO從1934年成立至今&#xff0c;專力致于精密測量儀器的研發和生產&#xff0c;在七十多年中&#xff0c;日本三豐量具MITUTOYO已成為世界最大綜合測量儀器的制造商&#xff0c;它生產的產品包括千分尺&#xff0c;卡尺&#xff0c;千分表&#xff0c;高度尺&…