我需要根据设置表中的记录,批量更新主表中的一个字段的值,设置表记录格式如下
id ,主干 , 其实线序号,终止线序号,areaid
1   x11          1          1200     2
大概有1000条记录
主表记录如下:
id  主干         线序号    areaid
2   x11           100          1
大概有8万条记录我需要根据设置表中的线序段,批量更新主表中的areaid
现写了如下存储过程进行循环更新:
CREATE  procedure prc_updatePairArea
as
begin tran
 --更新线序数据
 DECLARE @ID int
 SET NOCOUNT ON 
 DECLARE point SCROLL CURSOR
 FOR
   --选择线序段
   SELECT ID FROM Serv_PairArea  ORDER By cable_name
 OPEN point
 FETCH NEXT FROM point INTO @ID
 WHILE (@@fetch_status=0)
 BEGIN
   PRINT @ID
   --依次更新排名字段
   UPDATE serv_pair
   SET Pair_Area=(select areaID from serv_pairArea where id=@ID)
   where cable_name=(select cable_name from serv_pairArea where id=@ID)
          and Pair_nbr>=(select startPair_nbr from serv_pairArea where id=@ID)
   and Pair_nbr<=(select endPair_nbr from serv_pairArea where id=@ID)
   --移动到下一条  
   FETCH NEXT FROM point INTO @ID
      END
 SET NOCOUNT OFF
 DEALLOCATE point
 IF @@ERROR<>0
 BEGIN   PRINT 'ERROR'
   ROLLBACK TRAN  
 END
 commit tran  GO运行效率很慢,希望各位给个比较高效的解决方法,谢了!

解决方案 »

  1.   

    CREATE  procedure prc_updatePairArea
    as
    begin tran
     --更新线序数据
     DECLARE 
     @ID int,
     @areaID varchar(20),   --类型假设是这样,如果不是,自己改,下面三个也是
     @cable_name(50),
     @startPair_nbr int,
     @endPair_nbr int
     SET NOCOUNT ON 
     DECLARE point SCROLL CURSOR
     FOR
       --选择线序段
       SELECT ID FROM Serv_PairArea  ORDER By cable_name
     OPEN point
     FETCH NEXT FROM point INTO @ID for readonly  WHILE (@@fetch_status=0)
     BEGIN
       PRINT @ID
       --依次更新排名字段   select   @areaID=areaID,@cable_name=cable_name,@startPair_nbr=strartPair_nbr,@endPair_nbr=endPair_nbr 
       from serv_pairArea 
       where id=@ID
       UPDATE serv_pair
       SET Pair_Area=@areaID from serv_pairArea where id=@ID
       where cable_name=@cable_name 
             and Pair_nbr>=@startPair_nbr 
             and Pair_nbr<=@endPair_nbr 
       --移动到下一条  
       FETCH NEXT FROM point INTO @ID
          END
     SET NOCOUNT OFF
     DEALLOCATE point
     IF @@ERROR<>0
     BEGIN   PRINT 'ERROR'
       ROLLBACK TRAN  
     END
     commit tran  GO
      

  2.   

    难道不能用update关联表来更新吗?
    SQL 联机帮助中的例子:
    UPDATE titles
       SET ytd_sales = titles.ytd_sales + sales.qty
          FROM titles, sales
             WHERE titles.title_id = sales.title_id
             AND sales.ord_date = (SELECT MAX(sales.ord_date) FROM sales)