sqlserver自定义函数(标量值函数,表值函数)

在sqlserver中,根据函数返回值形式的不同将用户自定义的函数分为”标量值函数“和”表值函数“两种类型。如下图所示,可以在数据库中的可编程->函数中进行查看。


标量函数,返回单个值,表值函数返回表数据

1.标量值函数

标量值函数返回一个确定类型的标量值,其返回类型除text、ntext、image、cursor、timestamp、和table类型外的其他数据类型,函数体语句定义在begin-end内部。在returns(注意有带s)语句后定义返回值的数据类型,并且函数的最后一条语句必须为return,(注意没带s),其格式如下

<strong></strong><pre name="code" class="sql">CREATE FUNCTION 函数名(参数)
RETURNS 返回类型
AS
BEGIN
	SQL语句
	RETURN;
END

 下面是一个例子: 

--创建标量函数,返回两个数之间的较大者
CREATE FUNCTION dbo.F3_GetMax
(
	@a INT,   --函数的两个参数
	@b INT
)
RETURNS INT --返回类型为INT
AS
BEGIN
	DECLARE @max INT;
	IF(@a>=@b)
	BEGIN
		SET @max = @a;
	END
	ELSE
	BEGIN
		SET @max = @b
	END

	RETURN @max;  --最后return返回@max中的值
END

--调用函数
SELECT dbo.F3_GetMax(2,3);
注意:

(1)必须使用两部分组成函数的名字来调用函数,即架构.对象名,如dbo.F3_GetMax(2,3)

(2)所有的传入参数前必须加@

(3)不要写漏和写错关键字,如as,returns,return

(4)returns后面不是跟一个变量,而是跟变量的返回值类型

(5)在begin/end语句块中,使用的是return

2.表值函数

表值函数有分为:内联表值函数和多语句表值函数

(1)内联表值函数

内联表值函数以表的形式进行返回,函数体不需要像标量值表值函数一样使用begin/end进行包围,其返回值是由一个位于return子句中的select命令从数据库中筛选出来,格式如下

<strong></strong><pre name="code" class="sql">CREATE FUNCTION 函数名称(参数)
RETURNS TABLE
AS
RETURN
(
	一条sql查询语句
)

 下面是一个例子 

CREATE FUNCTION F3_GetEmployeeSalary
(
	@EmployeeID VARCHAR(50) --参数
)
RETURNS TABLE  --返回类型为表
AS
RETURN
(
	SELECT * FROM dbo.TEmployee
	WHERE EmployeeID = @EmployeeID   --通过一条sql查询语句获取表中数据
)
--函数调用
SELECT * FROM F3_GetEmployeeSalary('1')

注意:

1)只能返回Table,returns后边一定是table

2)as后面没有begin/end,只有一个return语句返回特定的记录

(2)多语句表值函数

多语句表值函数可以看做标量值函数与内联表值函数的结合体,其格式如下

CREATE FUNCTION 函数名(参数)
RETURNS 表变量名称(表变量字段定义)
AS
BEGIN
	SQL语句
	RETURN;
END
例子如下

CREATE FUNCTION dbo.GetEmployeeSalary
(
 @EmployeeID VARCHAR(50),
 @EmployeeName VARCHAR(50)
)
RETURNS @table TABLE  --定义表变量,用于返回结果集数据
(
 EmployeeID VARCHAR(50),
 EmployeeName VARCHAR(50),
 Salary INT,
 NowTime VARCHAR(50)
)
AS
BEGIN
 WITH CTEEmployeeSalary AS
 (
 SELECT 
 EmployeeName,
 EmployeeID,
 Salary,
 GETDATE() AS timeNow
 FROM dbo.TEmployee
 WHERE EmployeeID = @EmployeeID
 AND EmployeeName = @EmployeeName
 )


 INSERT INTO @table
 SELECT EmployeeName,EmployeeID,Salary,timeNow
 FROM CTEEmployeeSalary


 RETURN;  --return语句返回表变量
END

SELECT * FROM dbo.GetEmployeeSalary('1','aa')
注意:

1)returns后面直接定义返回的表类型,首先是定义表名,表明前面要加@,然后是关键字TABLE,最后是表的结构。(实质上是定义了一个表变量)

2) 在begin/end语句块中,直接将需要返回的结果insert到returns定义的表中就可以了,在最后return时,会将结果返回。

3) 最后只需要return,return后面不跟任何变量。(返回的是表变量里面的数据)


  • 17
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值