欢迎来到站长教程网!

mssql

当前位置:主页 > 数据库 > mssql >

Sqlserver 自界说函数 Function利用先容

时间:2021-05-05|栏目:mssql|点击:

一.FUNCTION:
在sqlserver2008中有3中自界说函数:标量函数/内联表值函数/多语句表值函数,首先总结下他们语法的异同点: 

同点:
1.建设界说是一样的: a, CREATE FUNCTION F_NAME(传入的参数名称 传入参数的范例) b,RETURNS 返回值范例 c,AS 异点:1.标量函数返回的是一个数据范例值,内联表值函数返回的是一个table,而多语句返回的是一个table的变量(雷同前面两个的团结);
2.语法的布局:标量函数和多语句函数都是要有begin,,,end,内联表值函数就没有;
3.挪用:标量函数要写成在dbo,function_name;

标量函数,操作上篇文章写的数据表,在[T_员工信息]表中查姓名为李异峰员工的工号:

USE SQL_SYSTEM 
GO
CREATE FUNCTION F_GONGHAO(@XINGMING NVARCHAR(5))
RETURNS INT 
AS
BEGIN
DECLARE @GONGHAO INT
SET @GONGHAO =(SELECT Y.工号 FROM[T_员工信息] AS Y WHERE Y.姓名 =@XINGMING )
RETURN @GONGHAO
END
GO
/*上面是标量函数的一个简朴的例举,下面就开始挪用,留意是在dbo.下*/
SELECT [姓名] FROM[T_员工信息] WHERE [姓名]='李异峰' /**比拟的查询*/
/*请留意调查,和比拟*/
SELECT [姓名],DBO.F_GONGHAO ('李异峰')AS 工号 FROM[T_员工信息] WHERE [姓名]='李异峰'
GO

F5下:

Sqlserver 自定义函数 Function操作介绍

内联表值函数:他返回的但是一个table哦,好比:筛选出2014.2.28号所有员工的打卡记录:

USE SQL_SYSTEM 
GO
CREATE FUNCTION F_DAKAJILU(@RIQI DATE)
RETURNS TABLE
AS
RETURN(
SELECT* FROM[T_考勤]AS K WHERE K.日期 =@RIQI 
)
GO
/*需要留意的就是他的写法上没有begin+end*/
/*下面就是将date带入函数中*/
SELECT*
FROM [F_DAKAJILU]('2014/02/28')
GO

F5:

Sqlserver 自定义函数 Function操作介绍

多语句表值函数就是,表值函数+内联表值函数综合版:就写个返回当天打卡记录和涉及员工的小我私家书息:

USE SQL_SYSTEM 
GO
CREATE FUNCTION F_D_DAKAJILU(@RIQI DATE)
RETURNS @TEMP_TABLE TABLE( /*这里要留意的就是既然是多语句的话,那你就要汇报计较机你要查询的列是哪些*/
[姓名]NVARCHAR(5) NOT NULL,
[工号]INT NOT NULL,
[地位]NVARCHAR(10) NOT NULL,
[部分]NVARCHAR(5) NOT NULL,
[是否夜班]NCHAR(1) NOT NULL,
[日期]DATE NOT NULL,
[当天上班时间]FLOAT(1)NOT NULL
) 
/*以上就是要汇报计较机你要的一个根基信息列*/
AS
BEGIN
INSERT INTO @TEMP_TABLE /*这句的意思是将下面的查询功效插入到@TEMP_TABLE变量中去*/
SELECT Y.姓名 ,Y.工号 ,Y.地位 ,Y.部分 ,K.夜班 ,K.日期 ,K.当天上班时间 
FROM[T_员工信息] AS Y CROSS JOIN [T_考勤] AS K  /*这里我用的是交错毗连*/
WHERE Y.工号 =K.工号 AND K.日期=@RIQI 
RETURN 
END
GO
SELECT*
FROM[F_D_DAKAJILU]('2014/02/28')
GO

F5:

Sqlserver 自定义函数 Function操作介绍

二:CURSOR,当要检索巨大的数据的每条数据的时候就可以用到它,雷同于c语言的指针一样,他可以在你的数据表中阅历每条数据和更新。 1.新写个cursor阅历数据表(T_员工信息)的数据进程: 1.1.声明一个只读cursor:

USE SQL_SYSTEM 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION CURSOR_READ_T_员工信息
DECLARE CUR_T_员工信息 SCROLL CURSOR FOR
SELECT Y.姓名 ,Y.工号 ,Y.地位 ,Y.部分 FROM[T_员工信息]AS Y ORDER BY Y.工号 ASC 
COMMIT TRANSACTION CURSOR_READ_T_员工信息
GO

1.2.打开:

OPEN GLOBAL CUR_T_员工信息
GO

1.3.阅历每条数据:

/*声明4个变量用来吸收暂存游标中的数据*/
DECLARE @XINGMING NVARCHAR(3),@GONGHAO INT,@ZHIWEI NVARCHAR(10),@BUMEN NVARCHAR(8)
/*操作全局变量求取当前数据表中的数据行数和*/
PRINT'当前数据表中有'+CAST(@@CURSOR_ROWS AS NVARCHAR(6))+'行数据。'
/*读取第一条数据并存入暂存变量中*/
FETCH FIRST FROM[CUR_T_员工信息]INTO @XINGMING,@GONGHAO,@ZHIWEI,@BUMEN
/*操作@@FETCH_STATUS返回的数值来确定cursor在数据表中读取的环境=0为fetch执行乐成*/
WHILE(@@FETCH_STATUS =0)
BEGIN
PRINT'姓名:'+@XINGMING+' 工号:'+CONVERT(VARCHAR(3),@GONGHAO)+' 地位:'+@ZHIWEI+' 部分:'+@BUMEN
FETCH NEXT FROM[CUR_T_员工信息] INTO @XINGMING,@GONGHAO,@ZHIWEI,@BUMEN
END
GO

F5:

Sqlserver 自定义函数 Function操作介绍

1.4.用完后就封锁和释放:

/*封锁*/
CLOSE GLOBAL CUR_T_员工信息
/*释放内存*/
DEALLOCATE GLOBAL CUR_T_员工信息
GO

这样的话就实现了读取每笔记录的成果,然后就可以用它来更新相关的数据条(所有的工号值+100):

USE SQL_SYSTEM 
/*下面声明和打开update——cursor*/
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION TR_UPDATE_YG 
DECLARE CUR_T_YG CURSOR FOR
SELECT YG.姓名 ,YG.工号 ,YG.地位 ,YG.部分 FROM[T_yuangongxinxi]AS YG FOR 
UPDATE 
OPEN GLOBAL CUR_T_YG
COMMIT TRANSACTION TR_UPDATE_YG

上一篇:SQl Function 建设函数实例先容

栏    目:mssql

下一篇:SQL分页查询方法汇总

本文标题:Sqlserver 自界说函数 Function利用先容

本文地址:www.jiaocheng88.com.cn/mssql/61975.html

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:584415406 | 邮箱:584415406#qq.com(#换成@)

Copyright © 2015-2020 小白站长教程网 版权所有 苏ICP备20040415号-3