Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > SQL操作行更新问题---使用游标
【标  题】:SQL操作行更新问题---使用游标
【关键字】:SQL,---
【来  源】:http://blog.csdn.net/WhenTrue/archive/2007/01/11/1480461.aspx

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

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

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

map_table

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

一开始考虑的时候是先把数据取出来,在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

 

oracle员工表精典查询:【上一篇】
Oracle用户查找死锁进程:【下一篇】
【相关文章】
  • Oracle & SQL 性能优化技巧
  • 更新库存SQL算法2.0版
  • 怎样让SQL只显示用户表
  • Sql tricks: multiple rows in one output value
  • Microsoft SQL Server 2005 简体中文开发版
  • SQL 嵌套游标的使用
  • sql优化(转载)
  • ETL学习笔记之三:MS SQL DTS
  • sql server procedure 导入/导出
  • ASP.NET2.0 连接 SQL SERVER2000 问题
  • 【随机文章】
  • 1.73版更新后的第一手经验心得
  • 关于在8086/88内存寻址方式
  • 住宿餐饮 - 酒店前台收银系统
  • 用正则表达式判断输入的数字是否合法的例子
  • 妙用MPC实现DVDRip双字幕播放
  • 用PHP写的SMTP类,支持附件(多个),支持HTML
  • 提高宽带速度
  • 有线电视宽带IP网建设
  • FreeBSD下OpenGL程序的问题
  • 使用gaim登录gtalk
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.