sqlserver 进阶(三) 函数的使用

函数相当于 Java 中的有返回值函数,可以被其它模块反复调用,在调用的时候, 可以被作为表达式的一部分。必须要有返回值。这个返回值既可以是 number 或 varchar2 这样简单的数据类型,也可以是 PL/SQL 数组或对象这样复杂的数据类型。函数会在数据库中一直保留,直到被删除。

1、语法结构

CREATE  FUNCTION function_name (
[arg1] arg_type1,
[arg2] arg_type2,
…… )
RETURN return_type
AS
声明部分
BEGIN
执行部分
EXCEPTION
异常处理部分
END;

说明:
RETURN 子句说明函数返回值的数据类型。
这是与过程的区别之一。
存在同名函数不会替换,只能删除已存在的函数才能创建
arg1,arg2,…,argn 是函数的形参的名称,是可选的。
arg_type1, arg_type2,…,arg_typen 是对应的形参的数据类型,参数类型可以是基本的数据类型。
return 可以返回一个表

2、示例

无参函数:
--创建函数,无参函数名后要加括号
create function func_first()
returns varchar
as
begin
declare @v_name varchar

select  @v_name=ename  from emp where empno=1
return @v_name
end;
create function now
(
)
returns datetime
as
begin
RETURN (SELECT GETDATE())
end
有参函数:
--新建标量值函数
create function FUNC_Sum1
(
@a int,
@b int
)
returns int
as
begin
return @a+@b
end
create function FUNC_Sum2
(
@b int
)
returns table
as
return ( select * from dept where deptno<@b )

--新建内联表值函数
create function FUNC_UserTab_1
(
@myId int
)
returns table
as
return (select * from ST_User where ID<@myId)
--新建多语句表值函数
create function FUNC_UserTab_2
(
@myId int
)
returns @t table
(
[ID] [int] NOT NULL,
[Oid] [int] NOT NULL,
[Login] [nvarchar](50) NOT NULL,
[Rtx] [nvarchar](4) NOT NULL,
[Name] [nvarchar](5) NOT NULL,
[Password] [nvarchar](max) NULL,
[State] [nvarchar](8) NOT NULL
)
as
begin
insert into @t select * from ST_User where ID<@myId
return
end;
--创建函数
create  function func_find(
@v_eno int
)
returns DECIMAL
as

begin
declare @v_ysal decimal
select @v_ysal= ISNULL(sal,0)*12+ISNULL(comm,0)   from emp where empno=@v_eno
return @v_ysal
end ;

3、执行

函数不能单独执行,在调用的时候, 只能作为表达式的一部分执行

BEGIN
select * from dbo.FUNC_Sum2(2)
END

BEGIN
print dbo.func_find(1)
end;
--调用表值函数
select * from dbo.FUNC_UserTab_1(15)
--调用标量值函数
declare @s int
begin
set @s=dbo.FUNC_Sum1(100,50)
print @s
end

4、删除

语法

DROP FUNCTION function_name;

其中,function_name 是函数的名称。

--删除函数
drop function func_first;

--删除标量值函数
drop function FUNC_Sum1