簡體   English   中英

SQL Server 2008上的批量刪除(是否有類似批量復制(bcp)的刪除數據?)

[英]Bulk DELETE on SQL Server 2008 (Is there anything like Bulk Copy (bcp) for delete data?)

SQL Server中有批量刪除的解決方案嗎?

我不能使用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 *
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 

PS。 SQL 2005/08 Ent中提供了分區。

希望這可以幫助!

剛遇到一個類似的問題,工作在一個臨時表上,該問題通過適當的鎖定進行擴展。

由於相關表僅在我們的某個位置引用,因此我們只需用動態表名稱的查詢替換該引用,動態表名稱使用類似於gbn建議的“select into”創建。

這是可維護的,因為登台表僅在代碼中的一個位置引用,並且額外數據庫調用和表創建的費用在倉儲上下文中是合理的。 如果您只有幾百條記錄或多次在代碼中引用該表,則此方法可能無效。

處理數百萬行時,我更喜歡使用WHERE語句並使用SELECT INTO復制表,刪除原始表並重命名副本(返回原始名稱)。

雖然,你應該考慮像(FK)鍵,約束等東西。 但是使用這種方法可以避免日志的badazz大小,並且可以避免在塊中刪除大量的時間。

/ Snedker

Sychare Jedko,

TRUNCATE的優點是避免記錄日志文件中的每個刪除。 TRUNCATE語句將為整個批次創建單個條目(在日志中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM