sqlserver2000中更新数据效率问题

问题描述:现sqlserver 2000数据库下有tJS007PregnantExamInfo表,数据量在400万左右。当向此表进行增、删、改的时候会调用其触发器来更新另一表(tJS008ExamValid)的数据。
具体如下:当tJS007PregnantExamInfo表中有以下数据:
主键                                                                         姓名       组内排序    查环时间
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    1    2008-06-02 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    2    2008-07-17 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    3    2008-08-06 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    4    2008-10-30 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e      张三    5    2010-03-20 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    6    2010-05-16 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    7    2010-08-13 00:00:00.000
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三    8    2010-09-05 00:00:00.000

表tJS008ExamValid有以下数据
主键                                                                         姓名      应查次数     有效次数
4394f8ad-4af2-4b47-9c30-c7ca5506949e    张三      3
应查次数表示一年(不一定是自然年)中应该检查的次数。如一年需检查3次,那么间隔四个月的检查算有效,如果在四个月内检查了N次,也算一次。那么下一次有效就是在最近一次有效的时间上加上四个月才算第二次有效,依此类推。在tJS007PregnantExamInfo中的触发器会调用fnc_ExamValidNum函数来计算次数并更新tJS008ExamValid表中的"有效次数"列的值。

现在遇到的问题就是批量操作表tJS007PregnantExamInfo的速度很慢,是否有更好的方案来解决此问题。(注,表tJS007PregnantExamInfo的主键和tJS008ExamValid的主键都有索引)

函数fnc_ExamValidNum
CREATE          FUNCTION fnc_ExamValidNum
(
   @begindate varchar(50),
   @enddate varchar(50),
   @guid varchar(50),
   @flag int
)RETURNS int
AS
BEGIN
  declare @num int;
  set @num=0;
  declare @bmonth int
  set @bmonth=12/@flag
  declare @min_date datetime;
  declare @curr_date datetime;
  declare getDateByGuid cursor for select fExamdate from dbo.tJS007PregnantExamInfo(nolock) where  fpersonalguid=@guid and fIsDeleted='0' and fExamDate between @begindate and @enddate order by fexamdate
  OPEN getDateByGuid
  FETCH NEXT FROM getDateByGuid INTO @min_date;
  if(@min_date is not null)
    set @num=@num+1;
  WHILE @@fetch_status = 0
BEGIN
  FETCH NEXT FROM getDateByGuid INTO @curr_date;
  if datediff(month,@min_date,@curr_date)>=@bmonth
  begin
     set @num=@num+1;
     set @min_date=@curr_date;
  end
END
  CLOSE getDateByGuid
  DEALLOCATE getDateByGuid
  return @num
END

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22962593/viewspace-689832/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22962593/viewspace-689832/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值