在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
检查这个
- 来自MSDN的文章Delete_a_Huge_Amount_of_Data_from
- 有关恢复模式的信息
- 并查看或更改数据库的恢复模式