我需要根据设置表中的记录,批量更新主表中的一个字段的值,设置表记录格式如下
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运行效率很慢,希望各位给个比较高效的解决方法,谢了!
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运行效率很慢,希望各位给个比较高效的解决方法,谢了!
解决方案 »
- 请教 自定义一个类,类里包含timer组件变量这样是否可行,该如何初始化
- 用Dephi做做了一个数据库相关得程序,在xp下运行没有问题,但是在2000系统下发现运行不稳定,请问是什么原因?
- 有谁见过这的错误?("FORM子句语法错误")?与adoconnection和adotable有关.
- 单元的问题,
- 业务导肮?
- 有人知道如何监视剪贴版吗???
- Fastnet中NMStrm如何应用,有困难请教!
- 谁有把mp3或wav转换成wma的控件?可以考虑出RMB购买,价格面谈(Email 或 OICQ)
- 问个比较傻的问题。Delphi中如何让非MainForm的窗体,在windows任务栏上显示标题
- 关注,关注,参与有分,不够还加
- 关于rave问题
- Initialization,Finalization這個代表 什麼意思??
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
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)