Si necesita restringir a lo filas que necesita para eliminar y no hacer una completa eliminación, o no se puede utilizar TRUNCATE TABLE (por ejemplo, la tabla está referenciada por una restricción FK, o incluido en una vista indizada), entonces usted puede hacer el eliminar en trozos:
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
en general, TRUNCATE es la mejor manera y lo usaría si fuera posible. Pero no puede usarse en todos los escenarios. Además, tenga en cuenta que TRUNCATE restablecerá el valor de IDENTIDAD para la tabla, si la hay.
Si está utilizando SQL 2000 o anterior, la condición TOP no está disponible, por lo que puede usar SET ROWCOUNT en su lugar.
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
Puede revertir un truncado si todavía está dentro del alcance de la transacción que realizó, contrario a la creencia popular de que está transaccionalizado, el IAM desasignado es no se elimina hasta la confirmación, por lo que se puede revertir restableciendo el IAM. – Andrew
Solo léalo, y tiene razón, en el servidor SQL puede revertir un truncado. Tenía en mente el oráculo donde no es posible (según la documentación). –
No puedo usar TRUNCATE porque MyTable tiene una clave foránea, también necesito la cláusula WHERE para los datos de filtro –