为了账号安全,请及时绑定邮箱和手机立即绑定

SQL Server 2008上的批量删除(是否有诸如批量复制(bcp)之类的功能用于删除数据?)

/ 猿问

SQL Server 2008上的批量删除(是否有诸如批量复制(bcp)之类的功能用于删除数据?)

HUWWW 2019-12-03 10:53:43

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

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

是否有类似批量复制(bcp)的删除数据的功能?


查看完整描述

3 回答

?
繁花不似锦

没有。


您需要带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


查看完整回答
反对 回复 2019-12-03
?
眼眸繁星

如果要删除表的一部分而不是表的一部分,可以做几件事TRUNCATE。


您可以将表的一部分选择到新表中,然后将两者切换,如下所示:


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

其次,如果您使用的是分区,则可以在相同的分区方案上创建相同的(空)表。如果该表是根据存档/清除逻辑进行分区的,则可以将一个分区块从主表移至新表,然后截断新表。例如:


ALTER TABLE MyTable

SWITCH PARTITION 15 TO purge_MyTable PARTITION 2 

GO; 


TRUNCATE TABLE purge_MyTable 

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


希望这可以帮助!


查看完整回答
反对 回复 2019-12-03
?
春华秋衣

只是在一个临时表上遇到了类似的问题,该临时表在使用适当的锁进行扩展时遇到了问题。

由于相关表只为我们一个地方引用,因此我们只用动态表名查询替换了该引用,该查询是用类似于gbn建议的“ select into”创建的。

这是可维护的,因为临时表仅在代码中的一个地方被引用,并且额外的数据库调用和创建表的开销在仓库上下文中是合理的。如果您只有几百条记录或在代码中多次引用该表,则此方法可能不起作用。


查看完整回答
反对 回复 2019-12-03

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信