SQL Server 多行数据处理(While循环和游标)

1.使用while

IF OBJECT_ID('tempdb..#temptest',N'U') IS NOT NULL
   DROP TABLE #temptest
GO
CREATE TABLE #temptest
(
ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL
,PatchID NUMERIC
,PatchName VARCHAR(50)
,[Status] INT DEFAULT 0
)

TRUNCATE TABLE #temptest

-- 插入临时表
INSERT INTO #temptest SELECT PatchID,PatchName,0 FROM dbo.SystemPatch

DECLARE @count INT 
DECLARE @i INT
SET @count=0
SET @i=1

SELECT @count = COUNT(1) FROM #temptest
-- 循环
WHILE @i<= @count
BEGIN
    UPDATE #temptest SET Status=1 WHERE ID=@i

    SET @i = @i +1 
END

-- SELECT * FROM #temptest

2.使用游标

IF OBJECT_ID('tempdb..#temptest2',N'U') IS NOT NULL
   DROP TABLE #temptest2

CREATE TABLE #temptest2
(
ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL
,PatchID NUMERIC
,PatchName VARCHAR(50)
,[Status] INT DEFAULT 0
)


-- 插入临时表
INSERT INTO #temptest2 SELECT PatchID,PatchName,0 FROM dbo.SystemPatch

DECLARE @patchid INT
SET @patchid=0
-- 游标
DECLARE syspatch CURSOR FOR SELECT PatchID FROM #temptest2
OPEN syspatch

FETCH NEXT FROM syspatch INTO @patchid  -- 读取第一行

WHILE @@FETCH_STATUS =0
BEGIN

    UPDATE #temptest2 SET Status=1 WHERE PatchID = @patchid

    FETCH NEXT FROM syspatch INTO @patchid -- 读取下一行
END

CLOSE syspatch
DEALLOCATE syspatch

-- SELECT * FROM #temptest2
 

测试: 1. 处理 13 条记录   

               while 处理耗时 : 0 s

               游标处理耗时:     0 s

               474801c4a26d1c3e6a8e048ee177507b164.jpg

           2. 处理617条记录

              while 处理耗时 :0s

               游标处理耗时:0s

8d98a82193aee5c0ae7c983e272057cc537.jpg

           3.处理169390

              while 处理耗时 :2s

4888a9a88102339d7516a93908003d4e91d.jpg

               游标处理耗时: 30m40s

9bc3173a18bfdc9398ef60a8bbb8bfaae66.jpg

 

 

转载于:https://my.oschina.net/guanxinsui/blog/2055504

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值