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)——参数默认值的更多相关文章

  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. ubuntu 16.04安装 navicat

    原文地址:http://www.cnblogs.com/wbJson/p/5655537.html 下载地址:http://download2.navicat.com/download/navicat ...

  2. 提高ASP.NET网站性能的方法

    http://www.360doc.com/content/14/0705/18/7662927_392224856.shtml   Asp.NET有许多秘密,当你了解了这些秘密后,可以使得你的ASP ...

  3. 编译OSG_FBX插件

    安装FBX的SDK,例如C:\Program Files\Autodesk\FBX\FBX SDK\2017.1\ 在CMake配置lib库路径的时候,使用 C:\Program Files\Auto ...

  4. 3698: XWW的难题[有源汇上下界最大流]

    3698: XWW的难题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 354  Solved: 178[Submit][Status][Discus ...

  5. 【BZOJ3211】花神游历各国 并查集+树状数组

    [BZOJ3211]花神游历各国 Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 41 100 5 551 1 22 1 ...

  6. R语言中的一些函数

    1.控制输出数字的精度 format(123.123,digits=4) 输出4位数字123.1,如果整数超过4位,小数部分就全被略去. options(digits=4) 功能同上,不过在Rsess ...

  7. 修改\Servlet和Jsp模板的方法

    1.在MyEclipse6.6\myeclipse\eclipse\plugins下找到com.genuitec.eclipse.wizards 2.templates\替换Servlet.java ...

  8. ERR_PTR,PTR_ERR还有IS_ERR函数详解

    内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来. 总体来说,如果内核返回一个指针,那么有三种情况:合法指针,NULL指针和非法指针. 1)合法指针:内核返回的指针一般是指向 ...

  9. TCP控制位 sendUrgentData 队列 队列元素 优先级 极限 急停 置顶

    Socket (Java Platform SE 7 ) https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#sendUrge ...

  10. linux 命令行 执行 php

    w为监控响应功能做准备. ubuntu@VM-52-248-ubuntu:~$ php -f /var/www/html/wlinux.phpwwubuntu@VM-52-248-ubuntu:~$ ...