![](/img/trans.png)
[英]BCP utility to create a format file, to import Excel data to SQL Server 2008 for BULK insertion
[英]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.