zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Sql函数的三种写法

SQL 函数 三种 写法
2023-09-14 09:11:19 时间

以前复制的创建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: