Se è necessario limitare a ciò che le righe è necessario eliminare e non fare una completa eliminazione, o non è possibile utilizzare TRUNCATE tABLE (ad esempio, la tabella è referenziato da un vincolo FK, o incluso in una vista indicizzata), allora si può fare la cancellazione in blocchi:
DECLARE @RowsDeleted INTEGER
SET @RowsDeleted = 1
WHILE (@RowsDeleted > 0)
BEGIN
-- delete 10,000 rows a time
DELETE TOP (10000) FROM MyTable [WHERE .....] -- WHERE is optional
SET @RowsDeleted = @@ROWCOUNT
END
in generale, TRUNCATE è il modo migliore e lo userei se possibile. Ma non può essere utilizzato in tutti gli scenari. Inoltre, nota che TRUNCATE ripristinerà il valore IDENTITY per la tabella se ce n'è uno.
Se si utilizza SQL 2000 o versioni precedenti, la condizione TOP non è disponibile, quindi è possibile utilizzare SET ROWCOUNT.
DECLARE @RowsDeleted INTEGER
SET @RowsDeleted = 1
SET ROWCOUNT 10000 -- delete 10,000 rows a time
WHILE (@RowsDeleted > 0)
BEGIN
DELETE FROM MyTable [WHERE .....] -- WHERE is optional
SET @RowsDeleted = @@ROWCOUNT
END
È possibile eseguire il rollback di un troncato se si è ancora all'interno dell'ambito della transazione eseguito, contrariamente a quanto si crede sia transazionale - lo IAM deallocato è non cancellato fino al commit in modo che possa essere ripristinato reintegrando lo IAM. – Andrew
Basta leggerlo e hai ragione, in SQL Server puoi eseguire il rollback di un troncato. Avevo oracle in mente dove non è possibile (secondo la documentazione). –
Non riesco a utilizzare TRUNCATE perché MyTable ha una chiave esterna anch'io ho bisogno della clausola WHERE per i dati del filtro –