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
*/
-- 用户自定义函数
-- 编程语言中的函数是用于封装经常执行的逻辑的子例程。
-- 任何代码若必须执行函数所包含的逻辑,都可以调用该函数,而不必重复所有的函数逻辑。
-- 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
*/
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- 最近比较流行的数据库挂马
- Oracle 手动创建数据库步骤详解
- 分割超大Redis数据库例子