楼主是不是想说职位的请假次数不能大于该职位的年假天数 用触发器吧 create trgger inserted_on on 请假表 for insert as begin ...... rollback transaction end
create trigger insert_on on 请假表 for insert as declare @n int declare @m int set @n=(select count(*) from 请假表 t where 职位=1 and 假别=1) set @m=(select 天数 from 年假 where 职位=1) --if(select count(*) from 请假表 where 职位=1 and 假别=1)>(select 天数 from 年假) if (@n>@m) begin rollback transaction raiserror('职位一的员工请假天数不能超过年假的天数!',16,20)end
不知对不对
create table #年假 (职位 int,年资 int,天数 int) insert into #年假 values(1,1,7) insert into #年假 values(9,2,7) create table #公体假 (职位 int,天数 int) insert into #公体假 values(1,7) insert into #公体假 values(9,7) create table #假别 (假编号 int,名称 nvarchar(50),) insert into #假别 values(1,'年假') insert into #假别 values(2,'公休假') create table #请假表 (职位 int,员工编号 nvarchar(50),假别 int) insert into #请假表 values(1,'001',1) insert into #请假表 values(9,'002',2) insert into #请假表 values(9,'002',2) insert into #请假表 values(9,'002',2) insert into #请假表 values(9,'002',2) insert into #请假表 values(9,'002',2) insert into #请假表 values(9,'002',2) go --另应有员工表,说明该员工年资,否则要以参数代入,还有,假别表没用,还是要通过参数来判断取哪个表,总之数据库设计得不太精妙 create procedure setqj (@ygbh varchar(10),@zw int,@jb int)--,@nz int as begin declare @flg int if @jb=1 select top 1 @flg=case when 天数>(select count(*) from #请假表 where 员工编号=@ygbh and 假别=@jb) then 1 else 0 end from #年假 where 职位=@zw --and 年资=@nz else if @jb=2 select top 1 @flg=case when 天数>(select count(*) from #请假表 where 员工编号=@ygbh and 假别=@jb) then 1 else 0 end from #公体假 where 职位=@zw if @flg=1 begin insert into #请假表 select @zw,@ygbh,@jb select '插入成功' end else if @flg=0 select '假期已满' else select '数据有误' end go exec setqj '002',9,2 go exec setqj '002',9,2 /*-------- 插入成功(1 行受影响) -------- 假期已满(1 行受影响) */ go drop table #年假,#公体假,#假别,#请假表 drop procedure setqj
用触发器吧
create trgger inserted_on
on 请假表
for insert
as
begin
......
rollback transaction
end
for insert
as
declare @n int
declare @m int
set @n=(select count(*) from 请假表 t where 职位=1 and 假别=1)
set @m=(select 天数 from 年假 where 职位=1)
--if(select count(*) from 请假表 where 职位=1 and 假别=1)>(select 天数 from 年假)
if (@n>@m)
begin
rollback transaction
raiserror('职位一的员工请假天数不能超过年假的天数!',16,20)end
不知对不对
insert into #年假 values(1,1,7)
insert into #年假 values(9,2,7)
create table #公体假 (职位 int,天数 int)
insert into #公体假 values(1,7)
insert into #公体假 values(9,7)
create table #假别 (假编号 int,名称 nvarchar(50),)
insert into #假别 values(1,'年假')
insert into #假别 values(2,'公休假')
create table #请假表 (职位 int,员工编号 nvarchar(50),假别 int)
insert into #请假表 values(1,'001',1)
insert into #请假表 values(9,'002',2)
insert into #请假表 values(9,'002',2)
insert into #请假表 values(9,'002',2)
insert into #请假表 values(9,'002',2)
insert into #请假表 values(9,'002',2)
insert into #请假表 values(9,'002',2)
go
--另应有员工表,说明该员工年资,否则要以参数代入,还有,假别表没用,还是要通过参数来判断取哪个表,总之数据库设计得不太精妙
create procedure setqj
(@ygbh varchar(10),@zw int,@jb int)--,@nz int
as
begin
declare @flg int
if @jb=1
select top 1 @flg=case when 天数>(select count(*) from #请假表 where 员工编号=@ygbh and 假别=@jb) then 1 else 0 end from #年假 where 职位=@zw --and 年资=@nz
else if @jb=2
select top 1 @flg=case when 天数>(select count(*) from #请假表 where 员工编号=@ygbh and 假别=@jb) then 1 else 0 end from #公体假 where 职位=@zw
if @flg=1
begin
insert into #请假表 select @zw,@ygbh,@jb
select '插入成功'
end
else if @flg=0
select '假期已满'
else
select '数据有误'
end
go
exec setqj '002',9,2
go
exec setqj '002',9,2
/*--------
插入成功(1 行受影响)
--------
假期已满(1 行受影响)
*/
go
drop table #年假,#公体假,#假别,#请假表
drop procedure setqj