您的位置:首页 > 数据库

Day 7(11.14):(8)用户自定义函数

2015-11-14 22:44 302 查看
-- 7 ****************************************************

-- 用户自定义函数

-- 编程语言中的函数是用于封装经常执行的逻辑的子例程。

-- 任何代码若必须执行函数所包含的逻辑,都可以调用该函数,而不必重复所有的函数逻辑。

-- 7.1 --------------------------------------------------

-- 制定输入值,返回确定的处理结果

/*

use Test

create table dbo.t_Products

(

p_id     int,

p_price  int,

discount decimal(18,3)

)

insert t_Products values (11,58,0.9)

insert t_Products values (12,25,null)

insert t_Products values (13,35,0.9)

insert t_Products values (14,180,0.8)

insert t_Products values (15,12,null)

*/

select * from t_Products

select p_id,p_price*discount as r_price from t_Products

create function dbo.FN_Discount(@discount decimal(18,3))

returns decimal(18,3)

begin

   if @discount is null

      begin

         set @discount=1

      end

   return @discount

end

select p_id,p_price * dbo.FN_Discount(discount) as r_price from t_Products

-- 7.2 --------------------------------------------------

-- 标量 UDF ,与内置函数类似

create function dbo.fn_dateformat(@date datetime,@separator char(1))

returns nvarchar(50)

as

begin

   return(

      convert(nvarchar(50),datepart(yy,@date))

     +@separator

     +convert(nvarchar(50),datepart(mm,@date))

     +@separator

     +convert(nvarchar(50),datepart(dd,@date))

   )

end

select dbo.fn_dateformat(getdate(),'_')

-- 7.3 --------------------------------------------------

-- 多语句表值 UDF , 试图与存储过程的结合

create function dbo.FN_Products()

returns @discount table

(p_id int,r_price decimal(18,3))

as

begin

   insert @discount select p_id,p_price * dbo.FN_Discount(discount) as r_price from t_Products

   return

end

select * from dbo.FN_Products()

-- 7.4 --------------------------------------------------

-- 嵌入式表值 UDF

/*

内容是单条 SELECT 语句

不用 BEGIN ... END

格式由结果定义

RETURNS 将表指定为数据类型

*/

create function dbo.FN_Order(@employeeid int)

returns table

as

return(select * from Northwind..orders where employeeid=@employeeid)

select * from dbo.FN_Order(4)

select * from dbo.FN_Order(9)

-- 练习 --------------------------------------------------

-- 1 编写自定义函数,对于8个输入的评分,要求去掉其中的最高分和最低分,返回剩下的评分的平均分(保留3位小数)

-- 2 要求新插入的数据记录的值不能大于之前所有数据值的平均值。

create table t(score int)

insert t values(100)

insert t values(90)

-- 2 编写自定义函数,通过输入 userindex 和 avatarindex ,得到 avatarnickname;

--   创建视图,查询 t_trade,结果集为 idx,fromavatarnickname,toavatarnickname,itemid,tradetime,使用刚才的函数

/*

use Test

Go

create table dbo.t_avatar(userindex int,avatarindex int,avatarnickname varchar(20))

insert t_avatar values (1001,1,'Neo')

insert t_avatar values (1001,2,'Trinity')

insert t_avatar values (1001,3,'Morpheus')

insert t_avatar values (2880,1,'Tom Sawyer')

insert t_avatar values (3230,3,'Celine Dion')

insert t_avatar values (7260,1,'Savage Garden')

insert t_avatar values (7610,2,'Linkin Park')

create table dbo.t_trade(idx int identity(1,1),fromuserindex int,fromavatarindex int,touserindex int,toavatarindex int,itemid int,tradetime datetime default(getdate()))

insert t_trade (fromuserindex,fromavatarindex,touserindex,toavatarindex,itemid) values (1001,1,2880,1,315)

insert t_trade (fromuserindex,fromavatarindex,touserindex,toavatarindex,itemid) values (1001,3,7610,2,618)

insert t_trade (fromuserindex,fromavatarindex,touserindex,toavatarindex,itemid) values (3230,3,1001,2,782)

insert t_trade (fromuserindex,fromavatarindex,touserindex,toavatarindex,itemid) values (7610,2,1001,1,588)

select * from t_avatar

select * from t_trade

*/

-- 3 创建2个函数 fn_encode、fn_decode,分别用于在注册用户信息时和用户验证身份时,加密和解密密码字段 password

/*

use Test

Go

create table dbo.t_user(username varchar(20) primary key,password varchar(5))

Go

create proc dbo.p_Register

@username varchar(20),

@password varchar(5)

as

insert t_user select @username,dbo.fn_encode(@password)

Go

create proc dbo.p_Login

@username varchar(20),

@password varchar(5)

as

declare @password_r varchar(5)

select @password_r=dbo.fn_decode(password) from t_user where username=@username

if @@rowcount=0

   return -1

if @password<>@password_r

   return -2

Go

exec p_Register 'Tom','ER5K9'

select * from t_user

declare @result int

exec @result=p_Login 'Tom','ER5K9'

select @result

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql server 数据库