CREATE PROCEDURE return_day @grade smallint ASif @grade=1 insert into VIP_lendinfo(return_date) values(dateadd(month,6,getdate()) else if @grade=2 insert into VIP_lendinfo(return_date) values(dateadd(month,3,getdate()) else if @grade=3 insert into VIP_lendinfo(return_date) values(dateadd(month,2,getdate()) else if @grade=4 insert into VIP_lendinfo(return_date) values(dateadd(month,1,getdate()) else raiserror("没有这样的会员级别!",1,2) go
to zhouhuajian: 我确实有一张会员级别表,里面有一个还书期限字段,但这个字段只说明不同级别的会员可以享受不同的还书期限,我还有一张会员借书信息表,里面记录的是会员借书的具体情况,其中有一个借书日期和一个应还书日期字段,应还书日期字段就是根据不同等级的会员和借书日期(当天)自动算出应还书日期。 还有关于级别,我想应该由有相关权限的用户(如系统管理员)来定吧。
set @grade=(select grade_ID from VIP_grade)这一句不对,子查询返回的值多于一个,怎能付与一个变量?你可以用修改。 update VIP_lendinfo set return_date=(dateadd(month,6,getdate()) where grade_id=1 update VIP_lendinfo set return_date=(dateadd(month,3,getdate()) where grade_id=2 update VIP_lendinfo set return_date=(dateadd(month,2,getdate()) where grade_id=3 update VIP_lendinfo set return_date=(dateadd(month,1,getdate()) where grade_id=4
SELECT return_date = CASE grade_id WHEN 1 THEN (dateadd(month,6,getdate()) WHEN 2 THEN (dateadd(month,3,getdate()) WHEN 3 THEN (dateadd(month,2,getdate()) WHEN 4 THEN (dateadd(month,1,getdate()) ELSE raiserror("没有这样的会员级别!",1,2) END
呵呵,没那么复杂。只是少了N个括号...CREATE PROCEDURE return_day @grade smallint AS set @grade=(select grade_ID from VIP_grade) begin if @grade=1 insert into VIP_lendinfo(return_date) values(dateadd(month,6,getdate())) else if @grade=2 insert into VIP_lendinfo(return_date) values(dateadd(month,3,getdate())) else if @grade=3 insert into VIP_lendinfo(return_date) values(dateadd(month,2,getdate())) else if @grade=4 insert into VIP_lendinfo(return_date) values(dateadd(month,1,getdate())) else raiserror('没有这样的会员级别!',1,2) end
我上面的只是解释语法错误,至于你的逻辑错误还要看看lyyrw(咋暖还寒) 的解释。 :)
to lyyrw: 谢谢,我有点明白了。但是现在有个问题,我一开始就没说清楚的,其实grade_ID字段不在VIP_lendinfo表中,在另外一张“会员等级表”中。其实我有三张表——“会员表”、“会员表等级表”和“会员表借书信息表”,其中相关字段为“会员号”、“会员等级”(会员表) “等级号”(会员表等级表) “会员号”、“应还书日期”(会员表借书信息表),所以一定要用变量的,或者是不是可以用子查询?
to lyyrw: 你的case...when我用了后,系统报错,是在when附近。
我重新写过了,但还是不对,问题好象是where附近,各位大虾出手相助啊。 CREATE PROCEDURE expectdate AS begin update VIP_lendinfo set return_expectdate=(dateadd(month,6,getdate()) where VIP_ID in (select VIP_ID from VIP_info where VIP_grade=1) update VIP_lendinfo set return_expectdate=(dateadd(month,3,getdate()) where VIP_ID in (select VIP_ID from VIP_info where VIP_grade=2) update VIP_lendinfo set return_expectdate=(dateadd(month,2,getdate()) where VIP_ID in (select VIP_ID from VIP_info where VIP_grade=3) update VIP_lendinfo set return_expectdate=(dateadd(month,1,getdate()) where VIP_ID in (select VIP_ID from VIP_info where VIP_grade=4) end
update VIP_lendinfo set return_expectdate='('dateadd(month,6,getdate()) where VIP_ID in (select VIP_ID from VIP_info where VIP_grade=1) 多了我加引号的半边括号。
天啊,有必要用这样的逻辑代码吗?下面的方法不行吗? 假设有三张表: 1、[会员等级表] 包括字段:会员级别 会员还书期限 2、[会员表] 包括字段:会员ID 会员级别 3、[会员借书信息表] 包括字段: 会员ID 还书日期 存储过程可根据会员ID直接改写其还书日期: CREATE PROCEDURE return_day @会员ID smallint AS DELCARE @还书期限 int SELECT @还书期限=会员还书期限 FROM [会员等级表] WHERE 会员级别=(SELECT 会员级别 FROM [会员表] WHERE 会员ID=@会员ID) UPDATE 会员借书信息表 SET 还书日期=dateadd(month,@还书期限,getdate())WHERE 会员ID=@会员ID GO
@grade smallint
ASif @grade=1
insert into VIP_lendinfo(return_date) values(dateadd(month,6,getdate())
else if @grade=2
insert into VIP_lendinfo(return_date) values(dateadd(month,3,getdate())
else if @grade=3
insert into VIP_lendinfo(return_date) values(dateadd(month,2,getdate())
else if @grade=4
insert into VIP_lendinfo(return_date) values(dateadd(month,1,getdate())
else
raiserror("没有这样的会员级别!",1,2)
go
建立一会员级别表,不同级别对应不同还书期限,当然本张表必须建立一个界面让用户自己设定。而后每次按级别取出相应的期限,就不需再用这IF...ELSE了,且关于级别应是让用户自己维护的吧,象你这样在后台写死了,如级别1的还书期限改为7个月了,你不是还要再改这段程序吗。
我确实有一张会员级别表,里面有一个还书期限字段,但这个字段只说明不同级别的会员可以享受不同的还书期限,我还有一张会员借书信息表,里面记录的是会员借书的具体情况,其中有一个借书日期和一个应还书日期字段,应还书日期字段就是根据不同等级的会员和借书日期(当天)自动算出应还书日期。
还有关于级别,我想应该由有相关权限的用户(如系统管理员)来定吧。
update VIP_lendinfo set return_date=(dateadd(month,6,getdate()) where grade_id=1
update VIP_lendinfo set return_date=(dateadd(month,3,getdate()) where grade_id=2
update VIP_lendinfo set return_date=(dateadd(month,2,getdate()) where grade_id=3
update VIP_lendinfo set return_date=(dateadd(month,1,getdate()) where grade_id=4
CASE grade_id
WHEN 1 THEN (dateadd(month,6,getdate())
WHEN 2 THEN (dateadd(month,3,getdate())
WHEN 3 THEN (dateadd(month,2,getdate())
WHEN 4 THEN (dateadd(month,1,getdate())
ELSE
raiserror("没有这样的会员级别!",1,2)
END
@grade smallint
AS
set @grade=(select grade_ID from VIP_grade)
begin
if @grade=1
insert into VIP_lendinfo(return_date) values(dateadd(month,6,getdate()))
else if @grade=2
insert into VIP_lendinfo(return_date) values(dateadd(month,3,getdate()))
else if @grade=3
insert into VIP_lendinfo(return_date) values(dateadd(month,2,getdate()))
else if @grade=4
insert into VIP_lendinfo(return_date) values(dateadd(month,1,getdate()))
else
raiserror('没有这样的会员级别!',1,2)
end
:)
谢谢,我有点明白了。但是现在有个问题,我一开始就没说清楚的,其实grade_ID字段不在VIP_lendinfo表中,在另外一张“会员等级表”中。其实我有三张表——“会员表”、“会员表等级表”和“会员表借书信息表”,其中相关字段为“会员号”、“会员等级”(会员表) “等级号”(会员表等级表) “会员号”、“应还书日期”(会员表借书信息表),所以一定要用变量的,或者是不是可以用子查询?
你的case...when我用了后,系统报错,是在when附近。
CREATE PROCEDURE expectdate
AS
begin
update VIP_lendinfo set return_expectdate=(dateadd(month,6,getdate()) where VIP_ID in (select VIP_ID from VIP_info where VIP_grade=1)
update VIP_lendinfo set return_expectdate=(dateadd(month,3,getdate()) where VIP_ID in (select VIP_ID from VIP_info where VIP_grade=2)
update VIP_lendinfo set return_expectdate=(dateadd(month,2,getdate()) where VIP_ID in (select VIP_ID from VIP_info where VIP_grade=3)
update VIP_lendinfo set return_expectdate=(dateadd(month,1,getdate()) where VIP_ID in (select VIP_ID from VIP_info where VIP_grade=4)
end
多了我加引号的半边括号。
假设有三张表:
1、[会员等级表] 包括字段:会员级别 会员还书期限
2、[会员表] 包括字段:会员ID 会员级别
3、[会员借书信息表] 包括字段: 会员ID 还书日期
存储过程可根据会员ID直接改写其还书日期:
CREATE PROCEDURE return_day
@会员ID smallint
AS
DELCARE @还书期限 int
SELECT @还书期限=会员还书期限 FROM [会员等级表] WHERE 会员级别=(SELECT 会员级别 FROM [会员表] WHERE 会员ID=@会员ID)
UPDATE 会员借书信息表 SET 还书日期=dateadd(month,@还书期限,getdate())WHERE 会员ID=@会员ID
GO