T-SQL大批量操作数据的时候限制受影响行数的方法
2010-07-25 22:44
337 查看
T-SQL的威力之一就是大批量操作数据。不过某些场景下需要限制t-sql影响的行数。比如以前艺龙遇到的场景是:对一个发布的表,一次更改太多的行,可能造成发布的崩溃。这次我遇到的场景是服务器性能不是很好,内存不够大,不限制影响行数的话,内存中可能已经容纳不下执行sql过程中产生的数据集,执行起来非常慢。
我们单位的DBA针对这种情况,写过一个存储过程来应对,核心的代码如下:
set rowcount 10000
delete
from temp
WHERE OperateTime > @CurrentDate
while @@rowcount>1
delete
from temp
WHERE OperateTime > @CurrentDate
set rowcount 0
其中用到了两个关键的参数,一个是RowCount,可以设置受影响行数。设为0表示不限。如果上面设了rowcount=10000,下面忘了设rowcount=0,再执行一个select,最多也就返回10000行。另外一个是@@RowCount,表示上一条sql影响的行数。
在sql server 2008 r2的bookonline中,说下一个版本将废除RowCount,建议改用其他方法,比如使用top参数。
我在最近的这个项目中,对这段代码做了两处改动:一是在删除过程中把被删除的数据插入到一个存档表,另外增加了一条日志:
set rowcount 10000
delete
from temp
OUTPUT deleted.*
INTO temp_deleted
WHERE OperateTime > @CurrentDate
exec PRSDBLOGAffectedRowCount @PackageType,1350,@@RowCount
while @@rowcount>1
delete
from temp
OUTPUT deleted.*
INTO temp_deleted
WHERE OperateTime > @CurrentDate
exec PRSDBLOGAffectedRowCount @PackageType,1350,@@RowCount
set rowcount 0
不过发现那个while循环语句没有执行,因为@@RowCount返回的是上一句sql“exec PRSDBLOGAffectedRowCount @PackageType,1350,@@RowCount”影响的行数。在PRSDBLOGAffectedRowCount中设了SET NOCOUNT ON,返回的@@RowCount都是0,下面的while循环永远不会执行。
最终修改如下:
declare @TempRowCount int = 0
set rowcount 10000
DELETE
FROM temp
OUTPUT deleted.*
into temp_deleted
WHERE DepartureDate < dateadd(day, 0 - @OldDataExpireDayCount, @CurrentDate)
set @TempRowCount = @@RowCount
exec PRSDBLOGAffectedRowCount @PackageType,100,@TempRowCount
while @TempRowCount>1
begin
DELETE
FROM temp
OUTPUT deleted.*
into temp_deleted
WHERE DepartureDate < dateadd(day, 0 - @OldDataExpireDayCount, @CurrentDate)
set @TempRowCount = @@RowCount
exec PRSDBLOGAffectedRowCount @PackageType,100,@TempRowCount
end
set rowcount 0
我们单位的DBA针对这种情况,写过一个存储过程来应对,核心的代码如下:
set rowcount 10000
delete
from temp
WHERE OperateTime > @CurrentDate
while @@rowcount>1
delete
from temp
WHERE OperateTime > @CurrentDate
set rowcount 0
其中用到了两个关键的参数,一个是RowCount,可以设置受影响行数。设为0表示不限。如果上面设了rowcount=10000,下面忘了设rowcount=0,再执行一个select,最多也就返回10000行。另外一个是@@RowCount,表示上一条sql影响的行数。
在sql server 2008 r2的bookonline中,说下一个版本将废除RowCount,建议改用其他方法,比如使用top参数。
我在最近的这个项目中,对这段代码做了两处改动:一是在删除过程中把被删除的数据插入到一个存档表,另外增加了一条日志:
set rowcount 10000
delete
from temp
OUTPUT deleted.*
INTO temp_deleted
WHERE OperateTime > @CurrentDate
exec PRSDBLOGAffectedRowCount @PackageType,1350,@@RowCount
while @@rowcount>1
delete
from temp
OUTPUT deleted.*
INTO temp_deleted
WHERE OperateTime > @CurrentDate
exec PRSDBLOGAffectedRowCount @PackageType,1350,@@RowCount
set rowcount 0
不过发现那个while循环语句没有执行,因为@@RowCount返回的是上一句sql“exec PRSDBLOGAffectedRowCount @PackageType,1350,@@RowCount”影响的行数。在PRSDBLOGAffectedRowCount中设了SET NOCOUNT ON,返回的@@RowCount都是0,下面的while循环永远不会执行。
最终修改如下:
declare @TempRowCount int = 0
set rowcount 10000
DELETE
FROM temp
OUTPUT deleted.*
into temp_deleted
WHERE DepartureDate < dateadd(day, 0 - @OldDataExpireDayCount, @CurrentDate)
set @TempRowCount = @@RowCount
exec PRSDBLOGAffectedRowCount @PackageType,100,@TempRowCount
while @TempRowCount>1
begin
DELETE
FROM temp
OUTPUT deleted.*
into temp_deleted
WHERE DepartureDate < dateadd(day, 0 - @OldDataExpireDayCount, @CurrentDate)
set @TempRowCount = @@RowCount
exec PRSDBLOGAffectedRowCount @PackageType,100,@TempRowCount
end
set rowcount 0
相关文章推荐
- T-SQL大批量操作数据的时候限制受影响行数的方法
- sql update操作数据更新成功,返回的影响行数是0
- 如何得到最近一次数据库操作影响的数据行数?
- 使用JDBC4.0操作XML类型的字段(保存获取xml数据)的方法
- C++操作MySQL大量数据插入效率低下的解决方法
- Ajax $.ajax() 提交数据出现中文乱码的时候解决方法
- 在mysql 安装后可以启动 bin-log 功能,以记录数据库的数据操作的记录,必要时候恢复数据,
- Activity生命周期学习笔记,和横竖切屏时候activity销毁时候保存数据和调用的方法
- 在做app应用的时候,需要将数据提交到服务器去存储,那么方法可以参考如下
- oracle数据库针对Timestamp类型的数据后面多了后三位的时候处理方法
- Android中Calendar与Date的区别以及消除时区对日期操作影响的方法
- 更换PostgreSql的data文件夹并重新服务器(此方法同样适用于系统崩溃后,找回数据的操作)
- php里少用到的session_module_name,以及session的key值限制,简单将session存储为json格式数据的方法
- MongoDB查询操作限制返回字段的方法
- mybatis 做 insert操作的时候返回插入的那条数据的id
- php oci8.dll 插入数据到oracle数据库 php操作oracle数据库 亲测 ORA-00911 无效字符错误解决方法
- js操作table表格导出数据到excel方法
- php操作redis中的hash和zset类型数据的方法和代码例子
- PHP中用jQuery 的操作POST方法提交数据(用login测试)
- hibernate传递给前台json数据的时候有些数据不匹配的解决方法