3 回答

TA貢獻(xiàn)1851條經(jīng)驗 獲得超4個贊
沒有。
您需要帶WHERE子句的DELETE:這是標(biāo)準(zhǔn)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

TA貢獻(xiàn)1873條經(jīng)驗 獲得超9個贊
如果要刪除表的一部分而不是表的一部分,可以做幾件事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
其次,如果您使用的是分區(qū),則可以在相同的分區(qū)方案上創(chuàng)建相同的(空)表。如果該表是根據(jù)存檔/清除邏輯進(jìn)行分區(qū)的,則可以將一個分區(qū)塊從主表移至新表,然后截斷新表。例如:
ALTER TABLE MyTable
SWITCH PARTITION 15 TO purge_MyTable PARTITION 2
GO;
TRUNCATE TABLE purge_MyTable
附言 分區(qū)在SQL 2005/08 Ent中可用。
希望這可以幫助!

TA貢獻(xiàn)1820條經(jīng)驗 獲得超9個贊
只是在一個臨時表上遇到了類似的問題,該臨時表在使用適當(dāng)?shù)逆i進(jìn)行擴(kuò)展時遇到了問題。
由于相關(guān)表只為我們一個地方引用,因此我們只用動態(tài)表名查詢替換了該引用,該查詢是用類似于gbn建議的“ select into”創(chuàng)建的。
這是可維護(hù)的,因為臨時表僅在代碼中的一個地方被引用,并且額外的數(shù)據(jù)庫調(diào)用和創(chuàng)建表的開銷在倉庫上下文中是合理的。如果您只有幾百條記錄或在代碼中多次引用該表,則此方法可能不起作用。
添加回答
舉報