SQL操作行更新问题---使用游标

本文介绍了一种使用SQL游标高效更新数据表的方法。通过游标逐行处理数据,实现从一个表中查找对应记录并更新另一个表的过程。具体展示了如何在SQL中声明和使用游标,以及如何通过条件判断来更新数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这张表格是要进行更行的表userData
USERID
1,2,3,4
4,5,6,7

下面这张表格是一张影射表,从userData表中找到与map_table相匹配的old_ID,并且用new_ID来更新响应的USERID

map_table

old_IDnew_ID
2Y222
1Y111
6Y666
8Y888
7Y777
4Y444
3Y333
5Y555

一开始考虑的时候是先把数据取出来,在CS代码中处理完以后再存放进去。但是这里遇到一个问题就是要一行一行地遍历userData表格,这就使得代码相当地难处理。既然是行处理,于是想到了用游标来解决这个问题。花了将近6个小时,终于把这个问题解决了,学到了不少东西,呵呵,贴上来分享。更新以后的userData表格如下:

userData
USERID
Y111,Y222,Y333,Y444
Y555,Y666,Y777,Y888

 


--Updating the Rows through CURSOR--
DECLARE @userid VARCHAR(
200) , @new_ID VARCHAR(200)
--逗号的索引位置--
DECLARE @index 
int
--逗号--
DECLARE @comma varchar(
3)
--存放sec_usrdata表里的userid--
DECLARE @temp VARCHAR(
200)
--保存要更新的数据--
DECLARE @sum varchar(
200)
DECLARE @new_ID_backup varchar(
200)
--查询纪录的行数--
DECLARE @rowCount 
int
-- 初始化--
set @comma = ','
set @index = 0
set @sum = ''
set @temp = ''
set @new_ID_backup = ''
set @rowCount =-1

--声明游标--
DECLARE curr1 CURSOR 

FOR SELECT USERID from SEC_USRDATA 
for Update

OPEN curr1
FETCH next from curr1 into @userid

WHILE (@@FETCH_status 
= 0)
    
BEGIN
    
--清空内容--
    
set @sum = ''
    
set @rowCount=-1
    
set @index = CHARINDEX(@comma,@userid,0)
    
set @temp = SUBSTRING(@userid,0,@index)
    

    Select @new_ID
=new_ID from Map_Table where old_id = @temp
    select @rowCount
=count(*) from Map_Table where old_id = @temp

    
if(@rowCount = 0)
        begin
            
set @sum = @sum+@temp+@comma
            
        end
    
if(@rowCount > 0)
        begin
            
set @sum = @sum+@new_ID+@comma
            
        end
    

    
while(@index < datalength(@userid))
        begin
            
set @userid = SUBSTRING(@userid,@index+1,datalength(@userid))
            
            
set @index = CHARINDEX(@comma,@userid,0)
            
            
if(@index = 0)
            begin
                
set @temp = SUBSTRING(@userid,0,datalength(@userid)+1)
                
                Select @new_ID
=new_ID from Map_Table where old_id = @temp
                select @rowCount
=count(*) from Map_Table where old_id = @temp
                
if(@rowCount = 0)
                    begin
                        
set @sum = @sum+@temp
                        print @sum
                    end
                
if(@rowCount > 0)
                    begin
                        
set @sum = @sum+@new_ID
                        print @sum
                    end
                
break
            end
            
else
            begin
                
set @temp = SUBSTRING(@userid,0,@index)
                Select @new_ID
=new_ID from Map_Table where old_id = @temp
                select @rowCount
=count(*) from Map_Table where old_id = @temp
                
                
if(@rowCount = 0)
                    begin
                        
set @sum = @sum+@temp+@comma
                        print @sum
                    end
                
if(@rowCount > 0)
                    begin
                        
set @sum = @sum+@new_ID+@comma
                        print @sum
                    end
            end

        end
    
if(@rowCount >= 0)
        begin
            update SEC_USRDATA Set USERID 
= @sum Where current of curr1
            FETCH NEXT FROM curr1 INTO @userid
        end
    
else
        begin
            Raiserror(
'Update Date failure',10,1)
            
break
        end
    
END
--CLOSE the CURSOR--
CLOSE curr1
--Deallocate the CURSOR--
DEALLOCATE curr1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值