表A
name        state        qu             date            IsZuZhi
aa            2          武汉        2009-11-15            否
bb            1          广州        2009-11-18            否
cc            2          广州        2009-11-22            是
dd            2          北京        2009-11-22            否
ee            2          上海        2009-11-23            否
ff            1          武汉        2009-11-30            是表B
qu        geRenTerm        zuZhiTerm 
武汉         10                15  
广州         5                 10
北京         10                20
上海         12                18
我想实现一个自动更新的功能,自动更新表A里的state
根据表A里的字段 qu 和 IsZuZhi 获取其对应的期限
例如记录 aa 的qu为“武汉”,IsZuZhi为“否”,state为 2 (只需改动state为2的记录)
则对应的期限为 10(天)
那么就用对应的 date 加上 10 (天)
如果得到的时间小于当前系统的时间
则将其 state 改为 0 根据此要求更新过的结果为:(表A)
name        state        qu             date            IsZuZhi
aa            0          武汉        2009-11-15            否
bb            1          广州        2009-11-18            否
cc            0          广州        2009-11-22            是
dd            0          北京        2009-11-22            否
ee            0          上海        2009-11-23            否
ff            1          武汉        2009-11-30            是如果看上面的描述还是不太明白
我就说下大致的流程:
某个人(name)在自己所属的城市(qu)申请一台空调
记录当前时间(date),并填写自己是否属于组织(IsZuZhi),初始状态为 1
当上级审核通过后,会改变date为当前更新的时间,状态改为 2
如果这个人在规定的时间内((表B)
武汉(qu)个人的期限(geRenTerm)是 10(天),组织的期限(zuZhiTerm)是 15(天))
没有去领这台空调,到时间就自动改变这挑记录的状态(改为0),作废这个问题主要有两点:
更新语句的编写;自动更新哪位大哥明白我的意思
帮我解决下
谢谢

解决方案 »

  1.   

    --> 测试数据:[表A]
    if object_id('[表A]') is not null drop table [表A]
    create table [表A]([name] varchar(2),[state] int,[qu] varchar(4),[date] datetime,[IsZuZhi] varchar(2))
    insert [表A]
    select 'aa',2,'武汉','2009-11-15','否' union all
    select 'bb',1,'广州','2009-11-18','否' union all
    select 'cc',2,'广州','2009-11-22','是' union all
    select 'dd',2,'北京','2009-11-22','否' union all
    select 'ee',2,'上海','2009-11-23','否' union all
    select 'ff',1,'武汉','2009-11-30','是'
    --> 测试数据:[表B]
    if object_id('[表B]') is not null drop table [表B]
    create table [表B]([qu] varchar(4),[geRenTerm] int,[zuZhiTerm] int)
    insert [表B]
    select '武汉',10,15 union all
    select '广州',5,10 union all
    select '北京',10,20 union all
    select '上海',12,18--select * from [表B]
    --select * from [表A]update [表A] 
    set [state] = case when 
    convert(varchar(10),dateadd(day,t.[geRenTerm],date),120)< convert(varchar(10),getdate(),120)
    then 0 else [state] end
    from [表A] r join [表B] t on
    r.qu = t.qu
    where r.[state] = 2select * from [表A]
    --结果
    -------------------------------------
    aa 0 武汉 2009-11-15 00:00:00.000 否
    bb 1 广州 2009-11-18 00:00:00.000 否
    cc 0 广州 2009-11-22 00:00:00.000 是
    dd 0 北京 2009-11-22 00:00:00.000 否
    ee 0 上海 2009-11-23 00:00:00.000 否
    ff 1 武汉 2009-11-30 00:00:00.000 是
      

  2.   


    --还要考虑是否组织
    --> 测试数据:[表A]
    if object_id('[表A]') is not null drop table [表A]
    create table [表A]([name] varchar(2),[state] int,[qu] varchar(4),[date] datetime,[IsZuZhi] varchar(2))
    insert [表A]
    select 'aa',2,'武汉','2009-11-15','否' union all
    select 'bb',1,'广州','2009-11-18','否' union all
    select 'cc',2,'广州','2009-11-22','是' union all
    select 'dd',2,'北京','2009-11-22','否' union all
    select 'ee',2,'上海','2009-11-23','否' union all
    select 'ff',1,'武汉','2009-11-30','是'
    --> 测试数据:[表B]
    if object_id('[表B]') is not null drop table [表B]
    create table [表B]([qu] varchar(4),[geRenTerm] int,[zuZhiTerm] int)
    insert [表B]
    select '武汉',10,15 union all
    select '广州',5,10 union all
    select '北京',10,20 union all
    select '上海',12,18--select * from [表B]
    --select * from [表A]update [表A] 
    set [state] = case when 
    convert(varchar(10),dateadd(day,(case [IsZuZhi] when '否' then t.[geRenTerm] else [zuZhiTerm] end),date),120)
    < convert(varchar(10),getdate(),120)
    then 0 else [state] end
    from [表A] r join [表B] t on
    r.qu = t.qu
    where r.[state] = 2select * from [表A]
    --结果
    -----------------------------------------
    aa 0 武汉 2009-11-15 00:00:00.000 否
    bb 1 广州 2009-11-18 00:00:00.000 否
    cc 0 广州 2009-11-22 00:00:00.000 是
    dd 0 北京 2009-11-22 00:00:00.000 否
    ee 0 上海 2009-11-23 00:00:00.000 否
    ff 1 武汉 2009-11-30 00:00:00.000 是
      

  3.   

    我认为要使用到作业了.定时作业的制定企业管理器 
    --管理 
    --SQL Server代理 
    --右键作业 
    --新建作业 
    --"常规"项中输入作业名称 
    --"步骤"项 
    --新建 
    --"步骤名"中输入步骤名 
    --"类型"中选择"Transact-SQL 脚本(TSQL)" 
    --"数据库"选择执行命令的数据库 
    --"命令"中输入要执行的语句: 
                           EXEC 存储过程名 ... --该存储过程用于创建表 --确定 
    --"调度"项 
    --新建调度 
    --"名称"中输入调度名称 
    --"调度类型"中选择你的作业执行安排 
    --如果选择"反复出现" 
    --点"更改"来设置你的时间安排  
    然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 设置方法: 
    我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定. 
      

  4.   

    declare @A table (name nvarchar(10),state int,
           qu nvarchar(10),date datetime,iszuzhi nvarchar(10))
    insert into @A select 'aa',2,'武汉','2009-11-15','否'
        union all  select 'bb',1,'广州','2009-11-18','否'
        union all  select 'cc',2,'广州','2009-11-22','是'
        union all  select 'dd',2,'北京','2009-11-22','否'
        union all  select 'ee',2,'上海','2009-11-23','否'
        union all  select 'ff',1,'武汉','2009-11-30','是'
    declare @B table (qu nvarchar(10),gerenterm int,zuzhiterm int)
    insert into @B select '武汉',10,15
         union all select '广州',5,10
         union all select '北京',10,20
         union all select '上海',12,18
    update a set state= case when dateadd(dd,b.gerenterm,a.date)<getdate() then 0 else state end
                  from @A a join @b b on a.qu=b.qu
                                 where state=2
    select * from @A
    /*(6 行受影响)(4 行受影响)(4 行受影响)
    name       state       qu         date                    iszuzhi
    ---------- ----------- ---------- ----------------------- ----------
    aa         0           武汉         2009-11-15 00:00:00.000 否
    bb         1           广州         2009-11-18 00:00:00.000 否
    cc         0           广州         2009-11-22 00:00:00.000 是
    dd         0           北京         2009-11-22 00:00:00.000 否
    ee         0           上海         2009-11-23 00:00:00.000 否
    ff         1           武汉         2009-11-30 00:00:00.000 是(6 行受影响)*/