在编程过程中,我们通常把特定的功能语句块封装称函数,方便代码的重用。我们可以在SQL Server中自定义函数,根据函数返回值的区别,我们自定义的函数分两种:标量值函数和表值函数。
自定义函数的优点:
- 模块化程序设计
- 更快的执行速度
- 减少网络传输
一个函数最多可以有1024个参数;在调用函数时,如果未定义参数的默认值,则必须提供已声明参数的值。
创建标量值函数
下面的这个函数根据生日返回年龄:
create function dbo.calcAge(@birthday datetime) --函数名和参数 returns int --返回值类型 as begin declare @now datetime declare @age int set @now=getdate() set @age=YEAR(@now)-YEAR(@birthday) return @age --返回值 end
执行这段脚本创建函数,创建成功之后,我们调用一下看看效果:
print dbo.calcAge('2000-1-1')
输出:15
注意:在调用自定义函数的时候,我们必须给出schema_name(架构名,此处是dbo),否则会提示“'calcAge' 不是可以识别的 内置函数名称。”
创建表值函数
顾名思义,表值函数的返回值不再是一个标量值,而是一个数据表;表值函数返回的表与其它数据表一样,可以进行join、where等操作。
create function getUser(@name nvarchar(50)) returns table as return ( select Id,UserName,[Status] from tb_user where UserName like '%' + @name + '%' )
上面的代码完成了一个表值函数的创建。
在创建的过程中遇到一点疑问:表值函数不能包含begin…end这样的语句块,只能用return返回table?此处存疑。
可以将表值函数放在select语句中使用:
select * from dbo.getUser('admin')
得到的结果集:
修改自定义函数
使用alter语句修改自定义函数,下面的代码演示如何修改getUser函数:
alter function getUser --指明要修改的函数名 (@status int) --修改参数类型 returns table as return ( select Id,UserName,[Status] from tb_user where [Status]=@status )
删除自定义函数
使用drop语句删除:
drop function calcAge