苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

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

查看: 308|回复: 1

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

[复制链接]
发表于 2018-12-6 18:00:35 | 显示全部楼层 |阅读模式
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

发表于 2018-12-7 18:42:28 | 显示全部楼层
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2019-5-27 03:13

© 2017-2018

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