SQL Server进阶(12)函数--表值函数、标量值函数、聚合函数、系统函数
概述
- 函数有且只有一个输入参数和一个返回值,而存储过程没有这个限制;
- 返回表变量的函数可以当做VIEW或者临时表用在WHERE/HAVING/SELECT/JOIN语句中而存储过程不可以;
- 存储过程中可以使用try-catch块和事务,而函数中不可以
表值函数
表值函数主要用于数据计算出来返回结果集,可以带参数(和视图的一个大的区别)
用户定义表值函数返回 table 数据类型,表是单个 SELECT 语句的结果集。
创建
CREATE FUNCTION Fun_GetStudents ( @age INT )--参数 RETURNS TABLE --返回类型为表 AS RETURN ( SELECT * FROM dbo.Student WHERE Sage = @age --通过一条sql查询语句获取表中数据 );
调用
SELECT * FROM Fun_GetStudents(18);
注意:
(1)只能返回Table,returns后边一定是table
(2)as后面没有begin/end,只有一个return语句返回特定的记录
标量值函数
创建
CREATE FUNCTION [dbo].[FUN_DataFormat] ( @strDate DATETIME ) RETURNS VARCHAR(20) AS BEGIN DECLARE @date VARCHAR(20); SET @date = DATENAME(YY, @strDate) + '年' + CONVERT(VARCHAR, MONTH(@strDate)) + '月' + CONVERT(VARCHAR, DAY(@strDate)) + '日'; RETURN @date; END;
调用
select dbo.FUN_DataFormat(getdate())
注意:
(1)必须使用两部分组成函数的名字来调用函数,即所有者.对象名,如dbo.F3_GetMax(2,3)
(2)所有的传入参数前必须加@
(3)不要写漏和写错关键字,如as,returns,return
(4)returns后面不是跟一个变量,而是跟变量的返回值类型
(5)在begin/end语句块中,使用的是return
聚合函数
常见的几个聚合函数
1、 求个数:count
2、 求总和:sum
3、 求最大值:max
4、 求最小值:min
5、 求平均值:avg
系统函数
sql中的表值函数与标量值函数区别与用法
通俗来讲:听名字就知道区别了
表值函数返回的是一张表结果,就和一个select查询语句一样,只不过里面带入了参数或者很复杂;
标量值函数返回的只是一个值
一 、表值函数又分为内联函数与多语句函数
(1)内联函数就是没有函数主体表是单个 SELECT。
下面是一个不带输入参数的表值函数 create function tvpoints() returns table as return ( select * from tb_users );
(2)下面是带参的内联表值函数
对于多语句表值函数,在 BEGIN...END 语句块中定义的函数体包含一系列 Transact-SQL 语句,这些语句可生成行并将其插入将返回的表中。 以下示例创建了一个表值函数. create function tvpoints() returns @points table (x float, y float) as begin insert @points values(1,2); insert @points values(3,4); return; end
(3)标量函数(返回一个具体类型的值而不是一张表了)
CREATE FUNCTION FUN_DataFormat (@strDate datetime) RETURNS varchar(20) AS BEGIN declare @date varchar(20) set @date = DATENAME(YY,@strDate)+'年'+Convert(VARCHAR,MONTH(@strDate))+'月'+Convert(VARCHAR,DAY(@strDate))+'日' return @date END
可以通过select dbo.FUN_DataFormat(getdate())来使用。(用的时候一定要在函数前面添加一个dbo或者的话数据库语句报错的会提示不认识的)
在SQL 2012基础教程中列出子句是按照以下顺序进行逻辑处理
FROM WHERE GROUP BY HAVING SELECT ORDER BY
IF EXISTS (SELECT 1 FROM TableName WHERE UserCode = @UserCode) BEGIN UPDATE TableName SET NotPushBeginTime = @NotPushBeginTime, NotPushEndTime = @NotPushEndTime WHERE UserCode = @UserCode END ELSE BEGIN INSERT INTO TableName (UserCode, NotPushBeginTime, NotPushEndTime, CreateTime) VALUES (@UserCode, @NotPushBeginTime, @NotPushEndTime, Getdate()) END
资料
https://blog.csdn.net/lvyanqin2013/article/details/78721239