本文转自:https://www.cnblogs.com/SunnyZhu/p/5719184.html

By行处理数据,推荐2种方式:

1、游标

2、While循环

我们来了解下这两种方案处理1w行数据分别需要多长时间。

一、游标。

首先我们填充一个表,用优雅的递归方式填充。

create table Orders(OrderID int,CostValue decimal(18,2) )

;with cte_temp
as
(
select 1 as OrderID
union all
select OrderID+1 from cte_temp where OrderID<10000
) insert into Orders(OrderID)
select OrderID from cte_temp option (maxrecursion 32767);

现在我们的订单表Orders有了一万条订单,但是CostValue还是NULL值。

我们用游标的方式给每一条订单添加一个CostValue,耗时44s。

--游标
DECLARE @OrderID int DECLARE cursor_CostValue CURSOR FOR SELECT OrderID FROM Orders
OPEN cursor_CostValue
FETCH NEXT FROM cursor_CostValue INTO @OrderID
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE Orders SET CostValue = OrderID+100 WHERE OrderID = @OrderID
FETCH NEXT FROM cursor_CostValue INTO @OrderID
END
CLOSE cursor_CostValue
DEALLOCATE cursor_CostValue

二、While循环

将数据放在临时表中,然后操作临时表,最后更新回总表。耗时16s。

DECLARE @RowID int

--    获取待处理的数据记录到临时表
-- 字段说明:RowID:记录行号 / DealFlg:行处理标识
SELECT RowID = IDENTITY(INT , 1, 1),DealFlg=0,OrderID,CostValue = 0
INTO #Tmp
FROM Orders
SELECT @RowID = MIN(RowID) FROM #Tmp WHERE DealFlg = 0
-- 若最小行号不为空(有需要处理的数据)
WHILE @RowID IS NOT NULL
BEGIN
UPDATE #Tmp SET DealFlg = 1,CostValue=OrderID+100 WHERE RowID = @RowID SELECT @RowID = MIN(RowID) FROM #Tmp WHERE DealFlg = 0
END
update O set O.CostValue=T.CostValue
from Orders O
inner join #Tmp T on O.OrderID=T.OrderID

还有一种错误的While循环,即不把数据放在临时表中,直接操作本表,会大大增加耗时。

因为多次调用本表,如果在生产环境,将是一个灾难。

DECLARE @OrderID INT
--表中OrderID最小的值
SELECT @OrderID = MIN(OrderID) FROM Orders where CostValue is null
WHILE @OrderID IS NOT NULL
BEGIN
UPDATE Orders SET CostValue = OrderID+100 WHERE OrderID = @OrderID
SELECT @OrderID = MIN(OrderID) FROM Orders where CostValue is null
END

参考链接:http://www.cnblogs.com/swq6413/archive/2012/09/01/2667190.html

[转]SQL Server中用While循环替代游标(Cursor)的解决方案的更多相关文章

  1. SQL Server 中用While循环替代游标Cursor的解决方案

    在编写SQL批处理或存储过程代码的过程中,经常会碰到有些业务逻辑的处理,需要对满足条件的数据记录逐行进行处理,这个时候,大家首先想到的方案大部分是用“游标”进行处理. 举个例子,在订单管理系统中,客服 ...

  2. SQL Server中用While循环替代游标(Cursor)的解决方案

    By行处理数据,推荐2种方式: 1.游标 2.While循环 我们来了解下这两种方案处理1w行数据分别需要多长时间. 一.游标. 首先我们填充一个表,用优雅的递归方式填充. ,) ) ;with ct ...

  3. SQL Server 内存泄露(memory leak)——游标导致的内存问题

    原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...

  4. 在SQL Server中用好模糊查询指令LIKE

    简介:like在sql中的使用 在SQL Server中用好模糊查询指令LIKE 查询是SQL Server中重要的功能,而在查询中将Like用上,可以搜索到一些意想不到的结果和效果,like的神奇之 ...

  5. 在SQL Server中用好模糊查询指令LIKE (转载)

    like在sql中的使用:在SQL Server中用好模糊查询指令LIKE:查询是SQL Server中重要的功能,而在查询中将Like用上,可以搜索到一些意想不到的结果和效果,like的神奇 一.一 ...

  6. SQL Server阻止了对组件xp_cmdshell过程的解决方案

    使用SQL tools连接sqlserver时候出现以下问题: SQL Server阻止了对组件xp_cmdshell过程的解决方案错误描述:SQL Server阻止了对组件‘xp_cmdshell’ ...

  7. SQL Server阻止了对组件xp_cmdshell过程的解决方案 分类: SQL Server 2015-03-05 08:31 305人阅读 评论(0) 收藏

    SQL Server阻止了对组件xp_cmdshell过程的解决方案 错误描述:SQL Server阻止了对组件'xp_cmdshell'的过程'sys.xp_cmdshell'的访问.因为此组件已作 ...

  8. SQL Server 事务、异常和游标

    转自:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110325.html Ø 事务 在数据库中有时候需要把多个步骤的指令当作一个整体来运行,这个整 ...

  9. SQL Server 存储过程、触发器、游标

    存储过程 1.存储过程是事先编好的.存储在数据库中的程序,这些程序用来完成对数据库的指定操作. 2.系统存储过程: SQL Server本身提供了一些存储过程,用于管理有关数据库和用户的信息. 用户存 ...

随机推荐

  1. Layui 手册一

    icon-图标 1:√2:×3:问号4:锁5:哭脸6:笑脸7:感叹号 使用layer.msg('',{ icon:1 });  目前只提供7种图标可选,用的适当还是很好看的. 表格刷新 parent. ...

  2. NetCore入门篇:(六)Net Core项目使用Controller之一

    一.简介 1.当前最流行的开发模式是前后端分离,Controller作为后端的核心输出,是开发人员使用最多的技术点. 2.个人所在的团队已经选择完全抛弃传统mvc模式,使用html + webapi模 ...

  3. js判断是否是数组

    //判断是否是数组function isArray(obj) {     return Object.prototype.toString.call(obj) === '[object Array]' ...

  4. VS2017仅我的代码警告

    每次调试都会出现"仅我的代码"警告,特别的烦人,取消方法如下: 1.点击工具,选择选项. 2.选择调试→常规,取消“启动时若没有用户代码则发出警告(仅限托管)”选项.

  5. .Net框架搭建:SQL Server EF MVC简单三层框架

    https://blog.csdn.net/pukuimin1226/article/details/52313656

  6. silverlight chart 折线图 的线颜色如何修改???

    silverlight  chart 折线图 的线颜色如何修改??? 我做出来都是这些偏黄色,请问如何修改线的颜色,以及线的宽度?谢谢

  7. css小点心

    本文由作者邹欣华授权网易云社区发布. 有一个在邮件中用饼图直观地显示用户的各项消费比例的需求.邮箱中不能用js,纯css实现饼图,只能通过后端模版渲染数据,所以数据越少越简单越好. 想到css3的tr ...

  8. yum 安装指定 kernel 版本源码

    yum install "kernel-devel-uname-r == $(uname -r)"

  9. 二:MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    上一篇博文MyBatis学习总结(一)——MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...

  10. 手把手教你如何安装和使用Karma-Jasmine

    注意:本文中出现的资料链接.karma的插件安装等,均可能需要翻$墙后才能正确执行. Jasmine是一个Javascript的测试工具,在Karma上运行Jasmine可完成Javascript的自 ...