SQL Server 自定义函数(Function)——参数默认值
sql server 自定义函数分为三种类型:标量函数(Scalar Function)、内嵌表值函数(Inline Function)、多声明表值函数(Multi-Statement Function)
标量函数:标量函数是对单一值操作,返回单一值。
内嵌表值函数:内嵌表值函数的功能相当于一个参数化的视图。它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体。
多声明表值函数:它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。
它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值型函数的不足。
创建标量函数的语法:
- create function [函数的所有者].函数名(标量参数 [as] 标量参数类型 [=默认值])
- returns 标量返回值类型
- [with {Encryption | Schemabinding }]
- [as]
- begin
- 函数体(即 Transact-SQL 语句)
- return 变量/标量表达式
- end
下面自定义一个根据传入参数(即学生性别)来计算学生平均身高的 Function,示例如下:
- use Test
- go
- create function dbo.AvgHeight(@Sex varchar(10)='男') --在这里是给参数默认值,即可以不传参数调用这个函数
- returns decimal
- as
- begin
- declare @AvgHeight decimal(10,2)
- select @AvgHeight=AVG(Convert(decimal(10,2),S_Height)) from Student where S_Sex=@Sex
- return @AvgHeight
- end
- go
执行用户自定义标量函数:
- select [函数的所有者].函数名 as 字段别名
- select dbo.AvgHeight(default) as AvgHeight; --返回 179
- select dbo.AvgHeight('男'); --返回 179
- select dbo.AvgHeight('女'); --返回 176
PS:创建函数时指定了函数所有者,那么调用的时候也必须指定函数的所有者。(一般都为 dbo)
调用自定义函数时如果想不传入参数而使用默认值,那么必须使用 default 关键字。如果自定义函数的参数没有默认值,那么会返回 null。
创建内嵌表值函数语法:
- create function [函数的所有者].函数名(标量参数 [as] 标量参数类型 [=默认值])
- returns table
- [with {Encryption | Schemabinding }]
- [as]
- return(单个 SELECT 语句,确定返回的表的数据。)
下面自定义一个根据传入参数(即学生学号)来查询学生信息的 Function,示例如下:
- use Test
- go
- create function dbo.SearchStuInfo(@Stu_No varchar(50)='')
- returns table
- as
- return(
- select S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate
- from Student where S_StuNo=@Stu_No)
- go
执行用户自定义内嵌表值函数:
- select * from dbo.SearchStuInfo(default); --返回学号为 001 的学生信息
- select * from dbo.SearchStuInfo(''); --返回学号为 008 的学生信息
创建多声明表值函数的语法:
- create function [函数的所有者].函数名(标量参数 [as] 标量参数类型 [=默认值])
- returns @表变量 table 表的定义(即列的定义和约束)
- [with {Encryption | Schemabinding }]
- [as]
- begin
- 函数体(即 Transact-SQL 语句)
- return
- end
下面自定义一个根据传入参数(即学生学号)来查询学生信息和课程,并计算出该学生的身高是否大于所有学生的平均身高的 Function,示例如下:
- use Test
- go
- create function dbo.SearchStuCou(@StuN varchar(10)='')
- returns @StuInfo table (
- StuNo varchar(50) not null primary key,
- StuName varchar(10) not null,
- StuSex varchar(10) not null,
- StuHeight varchar(10) null,
- StuAvgHeight decimal(10,2) null,
- StuConAvgHeight varchar(30) null,
- StuCou varchar(10) null
- )
- as
- begin
- declare @Height decimal(10,2)
- declare @AvgHeight decimal(10,2)
- declare @ConAvgHeight varchar(30)
- select @AvgHeight=AVG(Convert(decimal(10,2),S_Height)) --查询所有同学的平均身高
- from Student
- select @Height=Convert(decimal(10,2),S_Height) --查询指定学号的学生身高
- from Student
- where S_StuNo=@StuN
- if((@Height-@AvgHeight) > Convert(decimal(10,2),0))
- begin
- set @ConAvgHeight='大于平均身高'
- end
- else if((@Height-@AvgHeight) = Convert(decimal(10,2),0))
- begin
- set @ConAvgHeight='等于平均身高'
- end
- else
- begin
- set @ConAvgHeight='小于平均身高'
- end
- insert into @StuInfo(StuNo,StuName,StuSex,StuHeight,StuAvgHeight,StuConAvgHeight,StuCou)
- select s.S_StuNo,s.S_Name,s.S_Sex,s.S_Height,@AvgHeight,@ConAvgHeight,c.C_Name from Student s
- left join Course c on s.C_S_Id=c.C_Id
- where S_StuNo=@StuN
- return
- end
- go
执行用户自定义多声明表值函数:
- select * from dbo.SearchStuCou(default);
- select * from dbo.SearchStuCou('');
- select * from dbo.SearchStuCou('');
适用范围
1. 只查询,不修改数据库的状态(修改、删除表中记录等)
2. 结果集需要通过递归等方法得到时,可以使用函数,函数比较灵活
3. 结果集需要直接被引用时,可以使用函数。需要对结果集进行再加工(指放在select语句中等),可以使用函数,函数可以嵌在select等sql语句中。
注意事项:
用户自定义函数不能用于执行一系列改变数据库状态的操作
在编写自定义函数时需要注意的:
对于标量函数:
1. 所有的入参前都必须加@
2. create后的返回,单词是returns,而不是return
3. returns后面的跟的不是变量,而是返回值的类型,如:int,char等。
4. 在begin/end语句块中,是return。
内嵌表值函数:
1. 只能返回table,所以returns后面一定是TABLE
2. AS后没有begin/end,只有一个return语句来返回特定的记录。
多语句表值函数:
1. returns后面直接定义返回的表类型,首先是定义表名,表明前面要加@,然后是关键字TABLE,最后是表的结构。
2. 在begin/end语句块中,直接将需要返回的结果insert到returns定义的表中就可以了,在最后return时,会将结果返回。
3. 最后只需要return,return后面不跟任何变量。
参考:
http://www.cnblogs.com/xueyuangudiao/archive/2011/08/03/2126580.html
SQL Server 自定义函数(Function)——参数默认值的更多相关文章
- SQL server 自定义函数FUNCTION的使用
原文链接:https://blog.csdn.net/lanxingbudui/article/details/81736402 前言: 在SQL server中不仅可以可以使用系统自带 ...
- 13、SQL Server 自定义函数
SQL Server 自定义函数 在SQL Server中不仅可以使用系统函数(如:聚合函数,字符串函数,时间日期函数等)还可以根据需要自定义函数. 自定义函数分为标量值函数和表值函数. 其中,标量值 ...
- sql server 自定义函数的使用
sql server 自定义函数的使用 自定义函数 用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回 用户自定义函数的类型: 标量函数:返回一个标量值 表格值函数{内联表格值函 ...
- 也来谈谈SQL SERVER 自定义函数~
在使用SQL SERVER 数据库的时候,函数大家都应该用过,简单的比如 系统聚合函数 Sum(),Max() 等等.但是一些初学者编写自定义函数的时候,经常问起什么是表值函数,什么是标量值函数. 表 ...
- sql server自定义函数学习笔记
sql server中函数分别有:表值函数.标量函数.聚合函数.系统函数.这些函数中除系统函数外其他函数都需要用户进行自定义. 一.表值函数 简单表值函数 创建 create function fu_ ...
- SQL Server自定义函数( 转载于51CTO )
用户自定义函数自定义函数不能执行一系列改变数据库状态的操作,可以像系统函数在查询或存储过程等的程序中使用,也可以像相信过程一样能过 execute 命令来执行.自定义函数中存储了一个 Transact ...
- js中function参数默认值
--在dreamweaver做网站时,函数定义是在一个*.js文件中,其中定义了一个func,有四个参数,function func(string1,url,flag,icon),然后在另一个asp中 ...
- SQL Server 自定义函数(1)把某一列多行的值拼接成一个字符串
) SET @resultstr='' SELECT @resultstr=@resultstr+'|'+[BaseImage] FROM dbo.life_fc PRINT @resultstr 示 ...
- sql server 自定义函数
create function 函数名 (@pno int) returns int as begin declare @a int if not exists(select * from perso ...
随机推荐
- TortoiseGit 提交代码每次需要输入用户名和密码?
每次用TortoiseGit Pull或者Push的时候都会弹出让输入用户名.密码的框, 很麻烦 ,解决办法如下: 解决办法如下: Right click → TortoiseGit → Settin ...
- matlab判断图像是彩色图还是灰度图
matlab怎样看图像是彩色还是灰度_莹莹_新浪博客 http://blog.sina.com.cn/s/blog_76088a1f0101diq0.html 解决一: isrgb(A) 如果A是RG ...
- u盘作为git仓库,完成不同地方的代码同步
参考网上一篇 "把Git Repository建到U盘上去" 1.我经常有这样的需求,工作.家里需要对同一份代码或文档编辑,并希望在不同地方能同步: 如果是私密性不那么强,可以直接 ...
- shrink-to-fit(自适应宽度)
自适应宽度是指当未明白设定容器的宽度(或外边距设为auto)时,在特定的情况下容器的宽度会依据情况自行设定.而设定的结果往往并非我们想要的. W3C规范中描写叙述了几种shrink-to-fit的情况 ...
- iOS 7 新特性:视图控制器切换API
本文转载至 http://blog.jobbole.com/51588/ 本文由 伯乐在线 - studentdeng 翻译自 Chris Eidhof.欢迎加入技术翻译小组.转载请参见文章末尾处的要 ...
- 在Eclipse中显示.project和.classpath和.setting目录
在Eclipse中显示.project, .classpath, .gitignore文件和.setting文件夹 在Eclipse中使用git,并显示.gitigonre文件,进行项目管理 在Ecl ...
- IOS6.0调用通讯录和之前的差别
6.通讯录列表获取差异 自iOS6.0后获取通讯录列表需要询问用户,经过用户同意后才可以获取通讯录用户列表.而且ABAddressBookRef的初始化工作也由ABAddressBookCreate函 ...
- HYSBZ 2243(染色)
题目链接:传送门 题目大意:中文题,略 题目思路:树链剖分,区间更新,区间查询. 闲谈: 只想说这道题做的好苦逼..去长春现场赛之前就没A,回来后又做了2天才A掉,蒟蒻太菜了 这道题也没有想 ...
- [SharePoint 2010] Visual Studio 2010內撰寫視覺化WebPart超簡單
新一代的Visual Studio 2010對於SharePoint 2010的專案撰寫,有非常另人讚賞的改進. 以往寫一個WebPart要搞好多雜七雜八的步驟,也要硬寫HTML輸出,當然有人說可以寫 ...
- 在Mac osx使用ADT Bundle踩过的坑
前言 本篇博客整理一下笔者在Mac下使用ADT Bundle踩过的坑,Google现在也不支持Eclipse了,开发者也到了抛弃Eclipse的时候,但考虑到大部分Java的开发者还是比较习惯与Ecl ...