【发布时间】:2012-02-22 18:23:17
【问题描述】:
我正在尝试使用 SQL 数据阅读器将记录从一个表移动到存档表中。我想逐个记录地进行传输(而不是批量插入和删除),这样如果发生错误,就会丢失最少的数据量(并且必须从备份中恢复)。
我的问题是,如果我在读取记录后删除记录,SQL 阅读器会起作用吗?这是迄今为止做我想做的最简单和直接的方法。它会打开意外错误吗?
While myReader.Read // select * from tableA where older than 1 year record
insert the record into tableA_archive
delete the record from tableA
loop
这似乎有点类似于循环遍历您正在循环中修改的列表——我知道这会在 .net 中引起各种头痛
for aItem in listA
if aItem fits criteria, send to list B and delete from listA
next
在读者阅读时是否有任何理由不修改基础表?例如,如果我在循环中间开始删除记录,读者是否会使用某些索引来访问可能会发生变化的记录?
【问题讨论】:
-
为什么不只是
DELETE FROM tableA OUTPUT deleted.* INTO tableA_archive WHERE Dt <= DATEADD(year,-1,getdate())? -
@MartinSmith 不错,不知道 DELETE INTO 语法。
-
共识似乎是最好的方法是编写一个使用事务语句的 SQL 服务器存储过程。所以基本上我在事务中需要两条语句:将旧记录插入存档,从非存档中删除旧记录。事务语句将确保这两个语句都执行,或者两个语句都不执行。如果它在事务中遇到错误,则不会发生插入/删除。对吗?
-
另外,您似乎需要在事务中捕获错误并指定回滚,否则它可能会继续运行sqlteam.com/article/introduction-to-transactions
-
@MartinSmith,这应该是一个答案。
标签: .net sql-server ado.net sqldatareader