苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

分布式系统框架(V1.3) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper万能框架(V2.3) HttpHelper官方出品,无敌框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V1.9) 最牛的爬虫类,没有爬不到只有想不到 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 82|回复: 1

[Sql Server] sql大家说说数据库的循环怎么解决

[复制链接]
  • TA的每日心情
    开心
    昨天 09:05
  • 签到天数: 643 天

    [LV.9]以坛为家II

    发表于 7 天前 | 显示全部楼层 |阅读模式
    1. 我猜很多人第一选择是游标,但这个效率比较低下,少量数据还行,大量数据得等好长时间
         比如 我们要删除一个企业信息,条件是 Password='longaq',有时候不仅仅是一张表,如下
    [SQL] 纯文本查看 复制代码
    
    declare @ComUserID int;
    
      Declare Mycursor cursor for SELECT ComUserID FROM dbo.Com_Users WHERE Password='longaq'
      Open Mycursor                                 
      Fetch next from Mycursor into @ComUserID  --开始抓数据 
      while @@FETCH_STATUS = 0
        begin
    
            delete  from Com_users where comUserID=@ComUserID
            delete  from Company where comUserID=@ComUserID
            delete  from Position where comUserID=@ComUserID
    
            delete from Com_logo where comuserid=@ComUserID
    
        Fetch next from Mycursor into @ComUserID
        end
      Close Mycursor                         --关闭游标 
      Deallocate Mycursor                    --删除游标



    2.使用WHILE 循环

          获取需处理表的所有行以及行号,取最小行号min和最大行号max,进行循环
    [SQL] 纯文本查看 复制代码
    DECLARE @intMinId INT,@intMaxId INT,@intClubID INT,@lngUpdateAmount BIGINT
    
    SELECT RowID=IDENTITY(INT,1,1),A.ClubID,A.NeedAmount
    INTO #templist 
    FROM Game.UserCreateClubDesk AS A WHERE A.ServerID=@intServerID
    
    SELECT @intMinId =MIN(RowID),@intMaxId=MAX(RowID) 
    FROM #templist
    
    WHILE @intMinId<=@intMaxId
    BEGIN
        SELECT @intClubID=ClubID,@lngUpdateAmount=NeedAmount 
        FROM #templist WHERE RowID=@intMinId
        EXEC dbo.PrPsWeb_UpdateClubCash 
                    @intClubID,
                    @sintSourceType,
                    @lngUpdateAmount,
                    '127.0.0.1',
                    @chvMemo,
                    NULL,
        SET @intMinId=@intMinId+1
    END
    DROP TABLE #templist



    3.还有一个for循环也有时候也能用到

          利用游标循环更新MemberService表中的数据(更新每个用户所购买服务的时间)
    [SQL] 纯文本查看 复制代码
    DECLARE @UserId varchar(50)  
    DECLARE My_Cursor CURSOR --定义游标 
    FOR (SELECT UserId FROM dbo.MemberAccount) --查出需要的集合放到游标中 
    OPEN My_Cursor; --打开游标 
    FETCH NEXT FROM My_Cursor INTO @UserId; --读取第一行数据(将MemberAccount表中的UserId放到@UserId变量中) 
    WHILE @@FETCH_STATUS = 0     BEGIN         PRINT @UserId; --打印数据(打印MemberAccount表中的UserId)         
    UPDATE dbo.MemberService SET ServiceTime = DATEADD(Month, 6, getdate()) WHERE UserId = @UserId; --更新数据         
    FETCH NEXT FROM My_Cursor INTO @UserId; --读取下一行数据(将MemberAccount表中的UserId放到@UserId变量中)     
    END CLOSE My_Cursor; --关闭游标 
    DEALLOCATE My_Cursor; --释放游标 
    GO

  • TA的每日心情
    奋斗
    昨天 09:37
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    发表于 6 天前 | 显示全部楼层
    您需要登录后才可以回帖 登录 | 马上注册

    本版积分规则

    QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备17001017号-1 )

    GMT+8, 2018-12-13 00:22

    © 2017-2018

    快速回复 返回顶部 返回列表