在SQL Server 2008上批量删除(有没有像大容量复制(bcp)删除数据?)

在SQL Server中有批量删除的解决scheme吗?

我不能使用TRUNCATE,因为我想使用WHERE来限制行中的行。

是否有像大容量复制(BCP)删除数据?

没有。

你需要一个带有WHERE子句的DELETE:这是标准的SQL。

你可以做的是批量删除像这样:

SELECT 'Starting' --sets @@ROWCOUNT WHILE @@ROWCOUNT <> 0 DELETE TOP (xxx) MyTable WHERE ... 

或者如果你想删除很高比例的行…

 SELECT col1, col2, ... INTO #Holdingtable FROM MyTable WHERE ..opposite condition.. TRUNCATE TABLE MyTable INSERT MyTable (col1, col2, ...) SELECT col1, col2, ... FROM #Holdingtable 

如果你想删除你的表的一部分,而不是对它进行TRUNCATE ,你可以做几件事情。

你可以select一个表的一部分到一个新的表,然后切换两个,如下所示:

 SELECT * INTO tmp_MyTable FROM MyTable WHERE Key='Value' IF @@ROWCOUNT > 0 BEGIN EXEC sp_rename MyTable, old_MyTable, NULL EXEC sp_rename tmp_MyTable, MyTable, NULL TRUNCATE old_MyTable END 

其次,如果你正在使用分区,你可以在同一个分区scheme上创build一个相同的(空)表。如果表根据你的归档/清除逻辑分区,你可以将一个分区块从主表中移动到新表,然后截断新表。例如:

 ALTER TABLE MyTable SWITCH PARTITION 15 TO purge_MyTable PARTITION 2 GO; TRUNCATE TABLE purge_MyTable 

PS。 分区在SQL 2005/08 Ent中可用。

希望这可以帮助!

Sychare Jedko,

TRUNCATE的优点是避免logging日志文件中的每一个删除。 TRUNCATE语句将为整个批次创build单个条目(以日志logging)。

刚刚遇到了一个类似的问题,工作在一个临时表,有问题扩大适当的锁。

由于相关表只在一个位置被引用,所以我们简单地用dynamic表名查询来replace引用,这个查询是用类似于gbnbuild议的“select into”创build的。

这是可维护的,因为登台表仅在代码中的一个地方被引用,并且额外的数据库调用与表创build的开销在仓储上下文中是合理的。 如果您只有几百条logging,或者在代码中多次引用表,那么这种方法可能无效。

当处理数百行的数据时,我更喜欢使用WHERE语句,并使用SELECT INTO拷贝表删除原始表并重命名拷贝(回到原始名称)。

虽然,你应该有像(FK)键,约束等东西在脑海中。 但是使用这种方法可以避免日志的大小,并且避免了大量的时间消耗。

/ Snedker

检查这个

  1. 来自MSDN的文章Delete_a_Huge_Amount_of_Data_from
  2. 有关恢复模式的信息
  3. 并查看或更改数据库的恢复模式