Sql函数的三种写法
以前复制的创建sql函数比较乱,现在将我自己项目中的三种sql函数做下对比,一目了然:
(1)表值函数——方法一:直接创建临时表,并返回临时表。优点:函数体中间可以直接申明临时变量,并做各种逻辑处理,最后只要将需要返回的数据插入临时表,并return结束语返回就ok了。
(2)表值函数——方法二:直接返回表数据:缺点是:整个函数体中间不能申明临时变量,只能在一个查询语句中,做些逻辑处理,太坑了。
(3)标量值函数——方法三:函数直接返回字符串,没啥可说的,功能太单一,胜在轻便简单。
一.FUNCTION: 在sqlserver2008中有3中自定义函数:标量函数/内联表值函数/多语句表值函数,首先总结下他们语法的异同点:
同点:
1.创建定义是一样的:
a, CREATE FUNCTION F_NAME(传入的参数名称 传入参数的类型)
b,RETURNS 返回值类型
c,AS 异点:
1.标量函数返回的是一个数据类型值,内联表值函数返回的是一个table,而多语句返回的是一个table的变量(类似前面两个的结合);
2.语法的结构:标量函数和多语句函数都是要有begin,,,end,内联表值函数就没有;
3.调用:标量函数要写成在dbo,function_name;
标量函数,利用上篇文章写的数据表,在[T_员工信息]表中查姓名为李异峰员工的工号:
1 USE SQL_SYSTEM 2 GO 3 CREATE FUNCTION F_GONGHAO(@XINGMING NVARCHAR(5)) 4 RETURNS INT 5 AS 6 BEGIN 7 DECLARE @GONGHAO INT 8 SET @GONGHAO =(SELECT Y.工号 FROM[T_员工信息] AS Y WHERE Y.姓名 =@XINGMING ) 9 RETURN @GONGHAO 10 END 11 GO 12 /*上面是标量函数的一个简单的例举,下面就开始调用,注意是在dbo.下*/ 13 SELECT [姓名] FROM[T_员工信息] WHERE [姓名]='李异峰' /**对比的查询*/ 14 /*请注意观察,和对比*/ 15 SELECT [姓名],DBO.F_GONGHAO ('李异峰')AS 工号 FROM[T_员工信息] WHERE [姓名]='李异峰' 16 GO
F5下:
内联表值函数:他返回的可是一个table哦,比如:筛选出2014.2.28号所有员工的打卡记录:
1 USE SQL_SYSTEM 2 GO 3 CREATE FUNCTION F_DAKAJILU(@RIQI DATE) 4 RETURNS TABLE 5 AS 6 RETURN( 7 SELECT* FROM[T_考勤]AS K WHERE K.日期 =@RIQI 8 ) 9 GO 10 /*需要注意的就是他的写法上没有begin+end*/ 11 /*下面就是将date带入函数中*/ 12 SELECT* 13 FROM [F_DAKAJILU]('2014/02/28') 14 GO
F5:
多语句表值函数就是,表值函数+内联表值函数综合版:就写个返回当天打卡记录和涉及员工的个人信息:
1 USE SQL_SYSTEM 2 GO 3 CREATE FUNCTION F_D_DAKAJILU(@RIQI DATE) 4 RETURNS @TEMP_TABLE TABLE( /*这里要注意的就是既然是多语句的话,那你就要告诉计算机你要查询的列是哪些*/ 5 [姓名]NVARCHAR(5) NOT NULL, 6 [工号]INT NOT NULL, 7 [职位]NVARCHAR(10) NOT NULL, 8 [部门]NVARCHAR(5) NOT NULL, 9 [是否夜班]NCHAR(1) NOT NULL, 10 [日期]DATE NOT NULL, 11 [当天上班时间]FLOAT(1)NOT NULL 12 ) 13 /*以上就是要告诉计算机你要的一个基本信息列*/ 14 AS 15 BEGIN 16 INSERT INTO @TEMP_TABLE /*这句的意思是将下面的查询结果插入到@TEMP_TABLE变量中去*/ 17 SELECT Y.姓名 ,Y.工号 ,Y.职位 ,Y.部门 ,K.夜班 ,K.日期 ,K.当天上班时间 18 FROM[T_员工信息] AS Y CROSS JOIN [T_考勤] AS K /*这里我用的是交叉连接*/ 19 WHERE Y.工号 =K.工号 AND K.日期=@RIQI 20 RETURN 21 END 22 GO 23 SELECT* 24 FROM[F_D_DAKAJILU]('2014/02/28') 25 GO
F5:
相关文章
- sql 聚合语句,count的用法「建议收藏」
- SQL开发知识:详解SqlServer数据库中Substring函数的用法
- SQL与MySQL的异同比较(sql与mysql的区别)
- SQL Server中妙用时间——平等而又精谨的时光(sqlserver中时间)
- JSP JSTL <sql:param>标签:指定SQL参数
- MSSQL导出数据到SQL:实现快速简单的数据迁移(mssql导出sql)
- Oracle解锁SQL:实现精准控制(oracle解锁sql)
- 面对 SQL Server 面试,想要成功?这些技巧必须知道!(sqlserver面试)
- 脚本如何在Linux中执行SQL脚本(linux怎么执行sql)
- 如何使用 MySQL 导入 SQL 文件?(mysql导入sql文件)
- SQL Server标准版:开启您新一代数据库之旅(标准版sqlserver)
- 采用SQL正则替换MSSQL——最佳实践详解(sql正则替换mssql)
- SQL Server遭受重大破坏:严峻形势谁来拯救?(sqlserver被破坏)
- SQL Server用户表管理实践(sqlserver用户表)
- SQL Server给IP安装设置指南(sqlserver用ip)
- SQL Server中如何快速导出表数据(sqlserver到处表)
- SQL Server列存储技术——提高存储效率的利器(sqlserver列存储)
- Microsoft SQL数据库服务器驱动程序:命名舞姿(mssql驱动程序名称)
- 利用Oracle SQL工具实现数据库管理(oracle sql工具)
- 循环善用Oracle嵌套循环让你更有效地运行SQL语句(oracle为什么要嵌套)
- 使用SQL快速将数据导入Redis(sql导入redis)
- Redis VS SQL 哪种更适合解决您的问题(redis 适合sql吗)
- SQl语句(常见)
- PL/SQL日期时间类型函数及运算
- 一道sql面试题附答案
- Sql学习第三天——SQL关于CTE(公用表达式)的递归查询使用