加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer自定义函数学习

发布时间:2020-12-12 13:56:07 所属栏目:MsSql教程 来源:网络整理
导读:SQL?Server?2000? 允许用户创建自定义函数,自定义函数可以有返回值。? 自定义函数分为:标量值函数或表值函数? 如果? RETURNS? 子句指定一种标量数据类型,则函数为标量值函数。可以使用多条? Transact-SQL? 语句定义标量值函数。? 如果? RETURNS? 子句指定

SQL?Server?2000?允许用户创建自定义函数,自定义函数可以有返回值。?

自定义函数分为:标量值函数或表值函数?

如果?RETURNS?子句指定一种标量数据类型,则函数为标量值函数。可以使用多条?Transact-SQL?语句定义标量值函数。?
如果?RETURNS?子句指定?TABLE,则函数为表值函数。?
表值函数又可分为:内嵌表值函数(行内函数)或多语句函数?

如果?RETURNS?子句指定的?TABLE?不附带列的列表,则该函数为内嵌表值函数。?
如果?RETURNS?子句指定的?TABLE?类型带有列及其数据类型,则该函数是多语句表值函数。

标量值函数示例

代码如下:


CREATE?FUNCTION?dbo.Foo()
RETURNS?int
AS
BEGIN
declare?@n?int
select?@n=3
return?@n
END


内嵌表值函数示例?

代码如下:


CREATE?FUNCTION?dbo.Foo()
RETURNS?TABLE
AS
return?select?id,?title?from?msgs


内嵌表值函数只有一个?select?语句。?

多语句表值函数示例(部分)?

代码如下:


CREATE?FUNCTION?fn_FindReports?(@InEmpId?nchar(5))
RETURNS?@retFindReports?TABLE?(empid?nchar(5)?primary?key,
empname?nvarchar(50)?NOT?NULL,
mgrid?nchar(5),
title?nvarchar(30))
...

语法格式:

????CREATE?FUNCTION?<函数名称>
???????????????(
????????????????--?函数的参数(可以多个)
????????????????<@param1,?sysname,?@p1>?<data_type_for_param1,?,?int>,
????????????????<@param2,?@p2>?<data_type_for_param2,?char>
???????????????)
??????????????RETURNS
??????????????<@表变量名>??TABLE
??????????????(
???????????????--?返回的虚拟表中的字段??字段名?类型
???????????????<Column_1,?c1>?<Data_Type_For_Column1,
???????????????<Column_2,?c2>?<Data_Type_For_Column2,?int>
??????????????)
??????????????AS
??????????????BEGIN
????????????????????--?函数体,里面可以定义一些变量,总之最后返回的应该是个结果集
??????????????RETURN
??????????????END

??????????????GO

?

写法(工作中的例子):

???
CREATE?FUNCTION?getcallbackdata
?(@mycallerno?varchar(30),
??@myid?int
?)
RETURNS?@callbdata?TABLE
?(
?callerarea?varchar?(10),
?status?int,
?route?int,
?prefix?varchar(20),
?pcell?int,
?prate?money,
?prov?varchar(20)?NULL
?)
AS
?BEGIN
DECLARE?@arecode??varchar(10),
?@status?int,
?@route?int,
?@prefix?varchar(20),
?@pcell?int,
?@prate?money,
?@prov?varchar(20)

select?@arecode=areacode?from?sd_areaplay
select?@status=state??from?sd_account?where?pin='@mycallerno'
select?@prefix=prefix?from?sd_platformrouter
select?@pcell=feesec,@prate=afterfreefee?from?sd_payplan
insert?into?@callbdata?values(@arecode,@status,@route,@prefix,@pcell,@prate,@prov);
RETURN??
END

GO

?

调用方法:

?

??select?callerarea,status,route,prefix,pcell,prate,prov?from?t.getcallbackdata('mycallerno',mypid)

实际上,使用自定义函数还是很简单的!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读