13、SQL Server 自定义函数
SQL Server 自定义函数
在SQL Server中不仅可以使用系统函数(如:聚合函数,字符串函数,时间日期函数等)还可以根据需要自定义函数。
自定义函数分为标量值函数和表值函数。
其中,标量值函数用于返回单个值,而表值函数用于返回一个结果集。
函数参数
参数可以是常量、表中的某个列、表达式或其他类型的值。在函数中有三种类型的参数。
1、输入:指必须输入一个值。
2、可选值:在执行该参数时,可以选择不输入参数。
3、默认值:函数中默认有值存在,调用时可以不指定该值。
创建标量值函数
语法:
Create function 函数名(参数)
Returns 返回值数据类型
[with {Encryption | Schemabinding }]
[as]
begin
SQL语句(必须有return 变量或值)
End Schemabinding :将函数绑定到它引用的对象上(注:函数一旦绑定,则不能删除、修改,除非删除绑定)
例子:
drop function dbo.input --删除函数
go
create function dbo.input --定义函数 架构.方法名
(
@num1 int, --输入参数
@num2 int = null, --可选参数
@oper varchar = '+' --默认参数
)
returns int
as
begin
declare @sum int
if(@oper='+')
begin
set @sum = @num1 + @num2
end
else
begin
set @sum = 0
end
return @sum
end
go select dbo.input(1,null,default) --参1必填,参2可选,参3默认 select dbo.input(1,2,default) --输出3 select dbo.input(1,2,'*') --输出0 *没判断
自定义函数可以将值放在局部变量中,用set select exec赋值
declare @number int
select @number = dbo.input(1,2,default)
print @number declare @set int
set @set = dbo.input(1,2,default)
print @set declare @exec int
exec @exec = dbo.input 1,2,'+'
print @exec
在查询中引用函数
create table test(
id int identity(1,1),
name varchar(10),
birthDay datetime
) insert into test values('张三','1998-02-01'),
('李四','1981-10-1'),
('王五','1985-5-2') select * from test --测试信息

创建函数并执行后
create function dbo.getAge(@birthDay datetime)
returns int
as
begin
declare @age int
set @age = datediff(yy,@birthDay,getdate())
return @age
end select name as 姓名,dbo.getAge(birthDay) as 年龄 from test

注意:标量值函数不可以返回文本(text、ntext)、图像、游标或时间戳类型的数据,并且不能用来修改数据库状态。
在select语句中使用函数可能会带来负面影响,因为每返回一行都会调用函数一次。所以在返回大型数据集时应该格外避免使用复杂的函数。
表值函数
表值函数包含两种类型:内联函数和多语句函数。
内联表值函数仅返回一个结果集,而多语句函数可以在函数体中包含一些控制逻辑。
1、内联表值函数
语法:
create function 函数名(参数)
returns table
[with {Encryption | Schemabinding }]
as
return(一条SQL语句)
例子:
--创建
create function getDetails(@id int)
returns table
as
return(select * from student where id = @id) --执行一条语句后返回 --调用
select * from dbo.getDetails(10)
2、多语句函数
多语句函数可以通过多条语句来创建临时表,具体需要哪些字段,以及符合哪些要求的数据被添加到临时表中等。
语法:
create function 函数名(参数)
returns 表格变量名 table (表格变量定义)
[with {Encryption | Schemabinding }]
as
begin
SQL语句
end
例子:
create function dbo.Test()
returns @temp table (
name varchar(20),
sex char(2),
age int
)
as
begin
insert into @temp (name,sex,age) values ('多语句','嘛',18)
insert into @temp (name,sex,age) select name,sex,age from student where age > 18
return
end
可以看出,多语句函数返回结果是定义好表结构的虚拟表,最后有一个return用来告诉sql多语句已经执行完毕。不写会返回不了。
13、SQL Server 自定义函数的更多相关文章
- sql server 自定义函数的使用
sql server 自定义函数的使用 自定义函数 用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回 用户自定义函数的类型: 标量函数:返回一个标量值 表格值函数{内联表格值函 ...
- SQL Server 自定义函数(Function)——参数默认值
sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Functio ...
- 也来谈谈SQL SERVER 自定义函数~
在使用SQL SERVER 数据库的时候,函数大家都应该用过,简单的比如 系统聚合函数 Sum(),Max() 等等.但是一些初学者编写自定义函数的时候,经常问起什么是表值函数,什么是标量值函数. 表 ...
- sql server自定义函数学习笔记
sql server中函数分别有:表值函数.标量函数.聚合函数.系统函数.这些函数中除系统函数外其他函数都需要用户进行自定义. 一.表值函数 简单表值函数 创建 create function fu_ ...
- SQL Server自定义函数( 转载于51CTO )
用户自定义函数自定义函数不能执行一系列改变数据库状态的操作,可以像系统函数在查询或存储过程等的程序中使用,也可以像相信过程一样能过 execute 命令来执行.自定义函数中存储了一个 Transact ...
- SQL server 自定义函数FUNCTION的使用
原文链接:https://blog.csdn.net/lanxingbudui/article/details/81736402 前言: 在SQL server中不仅可以可以使用系统自带 ...
- sql server 自定义函数
create function 函数名 (@pno int) returns int as begin declare @a int if not exists(select * from perso ...
- SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0
最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面 ...
- SQL SERVER 自定义函数 split
Create function [dbo].[split] ( ), ) ) )) as begin declare @i int set @SourceSql=rtrim(ltrim(@Source ...
随机推荐
- Kendo UI for Angular 2 控件
Kendo UI for Angular 2 控件 伴随着 Angular 2 的正式 release,Kendo UI for Angular 2 的第一批控件已经发布了,当前是 Beta 版本,免 ...
- 单个ViewController支持横屏,其他全竖屏方法-b
如果项目中用了navigationViewController, 那么就应该新建一个uinavigationViewController的子类,然后在这个类里面写上下面的代码,在使用的时候就用自定义的 ...
- 发送邮件(E-mail)方法整理合集
在IOS开发中,有时候我们会需要用到邮件发送的功能.比如,接收用户反馈和程序崩溃通知等等.其实这个功能是很常用的,因为我目前就有发送邮件的开发需求,所以顺便整理下IOS发送邮件的方法. IOS原生自带 ...
- springtest+juint开发测试如下:
项目结构目录如下: UserMapper.java 为接口文件.User 为实体类.UserMapper.xml 为对应mybatis的xml文件.test为对应的测试包 applicationtes ...
- BZOJ 1072 排列
Description 给一个数字串\(s\)和正整数\(d\), 统计\(s\)有多少种不同的排列能被\(d\)整除(可以有前导\(0\)).例如\(123434\)有\(90\)种排列能被\(2\ ...
- BZOJ 1013 球形空间产生器
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...
- iOS 16进制颜色和UIcolor的转换
各种颜色之间的转换,会陆续更新, 实现了 16进制颜色(HEX).RGBA.HSBA.UIColor之间的 相互转换 使用示例(加号方法,类名调用) //UIColor 转 RGB.HSB RGBA ...
- DB2中的系统表SYSIBM.SYSDUMMY1
ORACLE中有一张系统数据库表DUAL用来访问系统的相关信息 SELECT SYSDATE FROM DUAL; --返回当前系统日期 ------------------------------ ...
- c#获取带有汉字的字符串长度
不知道大家注意没,用c#下自带的str.Length方法获得字符串str长度的时候,返回的总是字符的个数,但是如果字符串中包含汉字的话,一个汉字是占两个字符长度的,获取的长度值就有了问题. 解决方案: ...
- zabbix 添加jvm监控
1. zabbix 服务端安装,监控jmx 需要--enable-java zabbix 客户端不需要 --enable-java 2.zabbix_server端安装jdk 安装jdk [root@ ...