当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 关于值班管理的存储过程

MSSQL
精细讲述SQL Server数据库备份多种方法
让SQL Server也能使用2G以上内存
SQL Server数据库崩溃恢复之法
创建区分大小写的SQL Server 2000实例
SQL Server中易混淆的数据类型
如何优化SQL Server数据库查询
使用Robot连接SQL的例子
如何让你的SQL运行得更快
对Sql Server中的表添加级联更新和级联删除
常用SQL语句书写技巧
SQL Server与Oracle实施成本上的差异
解析SQL Server的数据类型 BLOB
SQL Server数据库和XML标识语言的集成
SQLServer 数据库还原和孤立用户的解决办法
SQL Server 2000/2005 分页SQL
Sql Server锁表
SQLServer2005实现远程数据库备份
SQL精妙语句
SQL Server 2008的逻辑查询处理步骤
如何让你的SQL运行得更快

MSSQL 中的 关于值班管理的存储过程


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 44 ::
收藏到网摘: n/a

 一个bt主任的要求 值班管理  要求如下

1 一组队列  n 个人, 有4种角色,领导,汉子,大妈,司机。n个人根据自己角色按顺序排好队

2 值班要求:周一到周日 1个领导值班1个司机值班;周一到周日 每晚1个汉子 值班;周六 周日 上午下午2个大妈值班;假期每天1个领导1个司机1个汉子上午下午2个大妈

3 要求队列可增删查该 ,人员顺序可以调整,队列发生变化时,值班表自动更新

4 要求队列人员随时可以抽调对列中的人员不参加本轮排序(出差或请假)下轮继续按队列顺序排序,人员抽调后 ,队列自动向前顶替

5 换班等...

建2个表

1 watching

    [datetime] 日期  [weekday]星期 [leaderid]领导id [maleid]汉子id [female1]大妈1id [female2]大妈2id  [driverid] 司机id  [mark]备注

2 watching_person

   [ordercode]人员编号 [personid] 人员id  [part]人员角色 [leave]是否离开  [mark]备注

part 为人员角色 1领导2汉子3大妈4司机

当新的队列产生时需要更细从明天以后的值班安排表(此处为30天),然后将 按角色排队好的 起始位置传给存储过程 (即 领到从第几位开始排 司机从第几位开始排 汉子 大妈...)

create proc Proc_WatchingSetup
  --参数为四种角色的起始位置
  @leader int,
  @Male int,
  @Female int,
  @Driver int
as

declare @i int                                           --计数器
declare @j int
declare @PersonID int
declare @weekday int
declare @InsertPoint datetime
declare @msg char(20)

set @i=1
set @j=1

-- 事务开始
Begin tran ReChange
--删除明天以后的记录(队列已改变删除以前的)
delete from Watching where [Datetime]>GetDate()

if (@@error <>0)
   Begin
     rollback tran
     set @msg='error1'
     return
   end

--重新插入后30天的日期和星期
while @i<=30
  begin
     insert Watching (Datetime,WeekDay) values (dateadd(day,@i,{fn curdate()}),datepart(weekday,dateadd(day,@i,{fn curdate()})))    
     set @i=@i+1
  end

if (@@error !=0)
   Begin
     rollback tran
     set @msg='error2'
     return
   end

--开始使用游标

set @j=1

--////首先按排队顺序读出领导的队列

declare cur_watchingPerson scroll cursor For
   select Personid  from watching_person where part=1 order by orderCode asc

open cur_watchingPerson

--移动到开始位置
fetch absolute @leader from cur_watchingPerson into @PersonID
if @@fetch_status=-1
   fetch first from cur_watchingperson into @PersonID

set @i=1


while @i<=30
  begin    

     while @j<=7 --最长可能是1人插入7天
       begin       
        update watching set LeaderId=@PersonID where [datetime]=(dateadd(day,@i,{fn curdate()}))       
        if (@@error !=0)
          Begin
           rollback tran
           set @msg='error3'
          return
        end
        --如果不足7天就到周末 退出循环 换人
        select @weekday=datepart(weekday,dateadd(day,@i,{fn curdate()}))
     &nb