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, sysname, @p2> <data_type_for_param2, , char>
)
RETURNS
<@表变量名> TABLE
(
-- 返回的虚拟表中的字段 字段名 类型
<Column_1, sysname, c1> <Data_Type_For_Column1, , int>,
<Column_2, sysname, 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)
实际上,使用自定义函数还是很简单的!