create proc <dbo>.<过程名> as declare @cItem varchar(50)/*对应评分项目*/, @cCondition varchar(50)/*对应评分条件*/ declare @nNumFen /*对应加分*/ int , @bFlag bit ,@nX int declare @nID int , @cCarID varchar(20), @nlimit_date int --自己对应什么类型自己去调定set @bFlag = 0 --初始化 begin trancreate diaoyouCursor /*游标名*/ scroll Cursor for --建立游标 SELECT 评分项目, 评分条件,加分 FROM DaoYou_PingFenBiaoZhun WHERE (评分项目 IN ('导游等级', '导游学历','服务年限'))open diaoyouCursorwhile ( 0 = 0 ) begin fetch next from diaoyouCursor into @cItem , @cCondition , @nNumFen --每条记录写入对应变量 if (@@Fetch_Status <> 0 ) break --无记录时退出循环
if ( @cItem = '导游等级' ) begin Update DaoYou_Info Set 等级分 = @nNumFen Where 导游等级 = @cCondition end else begin if ( @cItem ='导游学历' ) begin Update DaoYou_Info Set 学历分 = @nNumFen Where 学历 = @cCondition end else begin if ( @cItem = '服务年限' ) set @bFlag = 1 --避免嵌套太长 end end if ( @bFlag = 1 ) Begin Create twoCursorName Scroll Cursor for SELECT ID,导游发证, 年限分 FROM DaoYou_Info open twoCursorName while (0 = 0 ) begin fetch next from diaoyouCursor into @nID , @cCardID , @nLimit_date --每条记录写入对应变量 if (@@Fetch_Status <> 0 ) break --无记录时退出循环
set @nX = DATEDIFF(yy , @cCardID , getdate() ) -- response.write nx 我就不知怎样处理了.还是把@nX 写入一个表或零时表再查询.我就不写了 Update DaoYou_Info Set 年限分 = @nX Where ID = @nID end close twoCursorName Deallocate twoCursorName --释放
有个错误就是第二个fetch next from diaoyouCursor into @nID , @cCardID , @nLimit_date 复制时忘记改了
SELECT 评分项目, 评分条件,加分 FROM DaoYou_PingFenBiaoZhun WHERE (评分项目 IN ('导游等级', '导游学历','服务年限')) 这句话会有重复记录是不是最多只有三条记录
这个应该可以满足你的要求update a set 等级分=isnull(b.加分,a.等级分), 学历分=isnull(c.加分,a.学历分), 年限分=isnull(DATEDIFF(yy ,a.导游发证,getdate()),a.年限分) from DaoYou_Info a left join DaoYou_PingFenBiaoZhun b on a.导游等级=b.评分条件 and b.评分项目='导游等级' left join DaoYou_PingFenBiaoZhun c on a.学历=c.评分条件 and c.评分项目='学历' left join DaoYou_PingFenBiaoZhun d on a.学历=d.评分条件 and d.评分项目='服务年限'
TableA字段:评分项目,评分条件,评分标准
如“学历”为评分项目,评分条件有小学,初中等多个,评分标准为:小学1 分,初中2分等
TableA在初始时就会设置好,但可以修改;
TableB字段:姓名,学历加分等
当初始添加TableB数据时,学历加分从TableA取评分标准;
问题:现假设TableA中有多个评分标准,TableB中也有多条数据,每条数据都有可能是不同的学历,当TableA中的评分标准改变时,相应的要对TableB中的学历加分进行更新;
我就是想修改表1完成后批量对表2进行更新(不是同步更新)的存储过程!
游标循环就好像程序循环一样。用两级游标循环就可以实现
as
declare @cItem varchar(50)/*对应评分项目*/, @cCondition varchar(50)/*对应评分条件*/
declare @nNumFen /*对应加分*/ int , @bFlag bit ,@nX int
declare @nID int , @cCarID varchar(20), @nlimit_date int --自己对应什么类型自己去调定set @bFlag = 0 --初始化
begin trancreate diaoyouCursor /*游标名*/ scroll Cursor for --建立游标
SELECT 评分项目, 评分条件,加分
FROM DaoYou_PingFenBiaoZhun
WHERE (评分项目 IN ('导游等级', '导游学历','服务年限'))open diaoyouCursorwhile ( 0 = 0 )
begin
fetch next from diaoyouCursor into @cItem , @cCondition , @nNumFen --每条记录写入对应变量
if (@@Fetch_Status <> 0 ) break --无记录时退出循环
if ( @cItem = '导游等级' )
begin
Update DaoYou_Info Set 等级分 = @nNumFen Where 导游等级 = @cCondition end
else
begin
if ( @cItem ='导游学历' )
begin
Update DaoYou_Info Set 学历分 = @nNumFen Where 学历 = @cCondition end
else
begin
if ( @cItem = '服务年限' ) set @bFlag = 1 --避免嵌套太长
end
end if ( @bFlag = 1 )
Begin
Create twoCursorName Scroll Cursor for
SELECT ID,导游发证, 年限分
FROM DaoYou_Info
open twoCursorName
while (0 = 0 )
begin
fetch next from diaoyouCursor into @nID , @cCardID , @nLimit_date
--每条记录写入对应变量
if (@@Fetch_Status <> 0 ) break --无记录时退出循环
set @nX = DATEDIFF(yy , @cCardID , getdate() )
-- response.write nx 我就不知怎样处理了.还是把@nX 写入一个表或零时表再查询.我就不写了
Update DaoYou_Info Set 年限分 = @nX Where ID = @nID end close twoCursorName
Deallocate twoCursorName --释放
endend close diaoyouCursor
Deallocate diaoyouCursor --释放 UPDATE DaoYou_Info SET 初始分值 = 等级分 + 年限分 + 学历分 + 100 commit tran
return
ERROR_EXIT:
rollback tran
return
复制时忘记改了
FROM DaoYou_PingFenBiaoZhun
WHERE (评分项目 IN ('导游等级', '导游学历','服务年限'))
这句话会有重复记录是不是最多只有三条记录
等级分=isnull(b.加分,a.等级分),
学历分=isnull(c.加分,a.学历分),
年限分=isnull(DATEDIFF(yy ,a.导游发证,getdate()),a.年限分)
from DaoYou_Info a
left join DaoYou_PingFenBiaoZhun b on a.导游等级=b.评分条件 and b.评分项目='导游等级'
left join DaoYou_PingFenBiaoZhun c on a.学历=c.评分条件 and c.评分项目='学历'
left join DaoYou_PingFenBiaoZhun d on a.学历=d.评分条件 and d.评分项目='服务年限'