SQL Server 2008上的批量删除(是否有类似批量复制(bcp)的删除数据?)

mas*_*ani 15 sql t-sql sql-server sql-server-2008

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

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

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

gbn*_*gbn 25

没有.

您想要一个带有WHERE子句的DELETE:这是标准SQL.

您可以做的是批量删除,如下所示:

SELECT 'Starting' --sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
    DELETE TOP (xxx) MyTable WHERE ...
Run Code Online (Sandbox Code Playgroud)

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

SELECT col1, col2, ... INTO #Holdingtable
           FROM MyTable WHERE ..opposite condition..
TRUNCATE TABLE MyTable
INSERT MyTable (col1, col2, ...)
           SELECT col1, col2, ... FROM #Holdingtable
Run Code Online (Sandbox Code Playgroud)

  • @Allan Chua:你能证明临时表只存在于内存中吗? (4认同)

小智 5

如果您想删除表的一部分而不是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
Run Code Online (Sandbox Code Playgroud)

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

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

TRUNCATE TABLE purge_MyTable 
Run Code Online (Sandbox Code Playgroud)

附言。SQL 2005/08 Ent 中提供了分区。

希望这可以帮助!