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.mzph.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;高度尺&…