sql server 自定义函数分为三种类型:标量函数(Scalar Function)、内嵌表值函数(Inline Function)、多声明表值函数(Multi-Statement Function)

标量函数:标量函数是对单一值操作,返回单一值。

内嵌表值函数:内嵌表值函数的功能相当于一个参数化的视图。它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体。

多声明表值函数:它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。

它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值型函数的不足。

创建标量函数的语法:

  1. create function [函数的所有者].函数名(标量参数 [as] 标量参数类型 [=默认值])
  2. returns 标量返回值类型
  3. [with {Encryption | Schemabinding }]
  4. [as]
  5. begin
  6. 函数体(即 Transact-SQL 语句)
  7. return 变量/标量表达式
  8. end

下面自定义一个根据传入参数(即学生性别)来计算学生平均身高的 Function,示例如下:

  1. use Test
  2. go
  3.  
  4. create function dbo.AvgHeight(@Sex varchar(10)='男') --在这里是给参数默认值,即可以不传参数调用这个函数
  5. returns decimal
  6. as
  7. begin
  8. declare @AvgHeight decimal(10,2)
  9. select @AvgHeight=AVG(Convert(decimal(10,2),S_Height)) from Student where S_Sex=@Sex
  10. return @AvgHeight
  11. end
  12. go

执行用户自定义标量函数:

  1. select [函数的所有者].函数名 as 字段别名
  2.  
  3. select dbo.AvgHeight(default) as AvgHeight; --返回 179
  4. select dbo.AvgHeight('男'); --返回 179
  5. select dbo.AvgHeight('女'); --返回 176

PS:创建函数时指定了函数所有者,那么调用的时候也必须指定函数的所有者。(一般都为 dbo)

调用自定义函数时如果想不传入参数而使用默认值,那么必须使用 default 关键字。如果自定义函数的参数没有默认值,那么会返回 null。

创建内嵌表值函数语法:

  1. create function [函数的所有者].函数名(标量参数 [as] 标量参数类型 [=默认值])
  2. returns table
  3. [with {Encryption | Schemabinding }]
  4. [as]
  5. return(单个 SELECT 语句,确定返回的表的数据。)

下面自定义一个根据传入参数(即学生学号)来查询学生信息的 Function,示例如下:

  1. use Test
  2. go
  3.  
  4. create function dbo.SearchStuInfo(@Stu_No varchar(50)='')
  5. returns table
  6. as
  7. return(
  8. select S_StuNo,S_Name,S_Sex,S_Height,S_BirthDate
  9. from Student where S_StuNo=@Stu_No)
  10. go

执行用户自定义内嵌表值函数:

  1. select * from dbo.SearchStuInfo(default); --返回学号为 001 的学生信息
  2.  
  3. select * from dbo.SearchStuInfo(''); --返回学号为 008 的学生信息

创建多声明表值函数的语法:

  1. create function [函数的所有者].函数名(标量参数 [as] 标量参数类型 [=默认值])
  2. returns @表变量 table 表的定义(即列的定义和约束)
  3. [with {Encryption | Schemabinding }]
  4. [as]
  5. begin
  6. 函数体(即 Transact-SQL 语句)
  7. return
  8. end

下面自定义一个根据传入参数(即学生学号)来查询学生信息和课程,并计算出该学生的身高是否大于所有学生的平均身高的 Function,示例如下:

  1. use Test
  2. go
  3.  
  4. create function dbo.SearchStuCou(@StuN varchar(10)='')
  5. returns @StuInfo table (
  6. StuNo varchar(50) not null primary key,
  7. StuName varchar(10) not null,
  8. StuSex varchar(10) not null,
  9. StuHeight varchar(10) null,
  10. StuAvgHeight decimal(10,2) null,
  11. StuConAvgHeight varchar(30) null,
  12. StuCou varchar(10) null
  13. )
  14. as
  15. begin
  16. declare @Height decimal(10,2)
  17. declare @AvgHeight decimal(10,2)
  18. declare @ConAvgHeight varchar(30)
  19.  
  20. select @AvgHeight=AVG(Convert(decimal(10,2),S_Height)) --查询所有同学的平均身高
  21. from Student
  22.  
  23. select @Height=Convert(decimal(10,2),S_Height) --查询指定学号的学生身高
  24. from Student
  25. where S_StuNo=@StuN
  26.  
  27. if((@Height-@AvgHeight) > Convert(decimal(10,2),0))
  28. begin
  29. set @ConAvgHeight='大于平均身高'
  30. end
  31. else if((@Height-@AvgHeight) = Convert(decimal(10,2),0))
  32. begin
  33. set @ConAvgHeight='等于平均身高'
  34. end
  35. else
  36. begin
  37. set @ConAvgHeight='小于平均身高'
  38. end
  39.  
  40. insert into @StuInfo(StuNo,StuName,StuSex,StuHeight,StuAvgHeight,StuConAvgHeight,StuCou)
  41. select s.S_StuNo,s.S_Name,s.S_Sex,s.S_Height,@AvgHeight,@ConAvgHeight,c.C_Name from Student s
  42. left join Course c on s.C_S_Id=c.C_Id
  43. where S_StuNo=@StuN
  44.  
  45. return
  46. end
  47. go

执行用户自定义多声明表值函数:

  1. select * from dbo.SearchStuCou(default);
  2.  
  3. select * from dbo.SearchStuCou('');
  4.  
  5. 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)——参数默认值的更多相关文章

  1. SQL server 自定义函数FUNCTION的使用

    原文链接:https://blog.csdn.net/lanxingbudui/article/details/81736402 前言:        在SQL server中不仅可以可以使用系统自带 ...

  2. 13、SQL Server 自定义函数

    SQL Server 自定义函数 在SQL Server中不仅可以使用系统函数(如:聚合函数,字符串函数,时间日期函数等)还可以根据需要自定义函数. 自定义函数分为标量值函数和表值函数. 其中,标量值 ...

  3. sql server 自定义函数的使用

    sql server 自定义函数的使用 自定义函数 用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回 用户自定义函数的类型: 标量函数:返回一个标量值 表格值函数{内联表格值函 ...

  4. 也来谈谈SQL SERVER 自定义函数~

    在使用SQL SERVER 数据库的时候,函数大家都应该用过,简单的比如 系统聚合函数 Sum(),Max() 等等.但是一些初学者编写自定义函数的时候,经常问起什么是表值函数,什么是标量值函数. 表 ...

  5. sql server自定义函数学习笔记

    sql server中函数分别有:表值函数.标量函数.聚合函数.系统函数.这些函数中除系统函数外其他函数都需要用户进行自定义. 一.表值函数 简单表值函数 创建 create function fu_ ...

  6. SQL Server自定义函数( 转载于51CTO )

    用户自定义函数自定义函数不能执行一系列改变数据库状态的操作,可以像系统函数在查询或存储过程等的程序中使用,也可以像相信过程一样能过 execute 命令来执行.自定义函数中存储了一个 Transact ...

  7. js中function参数默认值

    --在dreamweaver做网站时,函数定义是在一个*.js文件中,其中定义了一个func,有四个参数,function func(string1,url,flag,icon),然后在另一个asp中 ...

  8. SQL Server 自定义函数(1)把某一列多行的值拼接成一个字符串

    ) SET @resultstr='' SELECT @resultstr=@resultstr+'|'+[BaseImage] FROM dbo.life_fc PRINT @resultstr 示 ...

  9. sql server 自定义函数

    create function 函数名 (@pno int) returns int as begin declare @a int if not exists(select * from perso ...

随机推荐

  1. TortoiseGit 提交代码每次需要输入用户名和密码?

    每次用TortoiseGit Pull或者Push的时候都会弹出让输入用户名.密码的框, 很麻烦 ,解决办法如下: 解决办法如下: Right click → TortoiseGit → Settin ...

  2. matlab判断图像是彩色图还是灰度图

    matlab怎样看图像是彩色还是灰度_莹莹_新浪博客 http://blog.sina.com.cn/s/blog_76088a1f0101diq0.html 解决一: isrgb(A) 如果A是RG ...

  3. u盘作为git仓库,完成不同地方的代码同步

    参考网上一篇 "把Git Repository建到U盘上去" 1.我经常有这样的需求,工作.家里需要对同一份代码或文档编辑,并希望在不同地方能同步: 如果是私密性不那么强,可以直接 ...

  4. shrink-to-fit(自适应宽度)

    自适应宽度是指当未明白设定容器的宽度(或外边距设为auto)时,在特定的情况下容器的宽度会依据情况自行设定.而设定的结果往往并非我们想要的. W3C规范中描写叙述了几种shrink-to-fit的情况 ...

  5. iOS 7 新特性:视图控制器切换API

    本文转载至 http://blog.jobbole.com/51588/ 本文由 伯乐在线 - studentdeng 翻译自 Chris Eidhof.欢迎加入技术翻译小组.转载请参见文章末尾处的要 ...

  6. 在Eclipse中显示.project和.classpath和.setting目录

    在Eclipse中显示.project, .classpath, .gitignore文件和.setting文件夹 在Eclipse中使用git,并显示.gitigonre文件,进行项目管理 在Ecl ...

  7. IOS6.0调用通讯录和之前的差别

    6.通讯录列表获取差异 自iOS6.0后获取通讯录列表需要询问用户,经过用户同意后才可以获取通讯录用户列表.而且ABAddressBookRef的初始化工作也由ABAddressBookCreate函 ...

  8. HYSBZ 2243(染色)

    题目链接:传送门 题目大意:中文题,略 题目思路:树链剖分,区间更新,区间查询. 闲谈:      只想说这道题做的好苦逼..去长春现场赛之前就没A,回来后又做了2天才A掉,蒟蒻太菜了 这道题也没有想 ...

  9. [SharePoint 2010] Visual Studio 2010內撰寫視覺化WebPart超簡單

    新一代的Visual Studio 2010對於SharePoint 2010的專案撰寫,有非常另人讚賞的改進. 以往寫一個WebPart要搞好多雜七雜八的步驟,也要硬寫HTML輸出,當然有人說可以寫 ...

  10. 在Mac osx使用ADT Bundle踩过的坑

    前言 本篇博客整理一下笔者在Mac下使用ADT Bundle踩过的坑,Google现在也不支持Eclipse了,开发者也到了抛弃Eclipse的时候,但考虑到大部分Java的开发者还是比较习惯与Ecl ...