Si vous devez limiter à ce que les lignes que vous devez supprimer et ne pas faire une complète suppression, ou vous ne pouvez pas utiliser TRUNCATE TABLE (par exemple, la table est référencée par une contrainte FK ou inclus dans une vue indexée), alors vous pouvez faire la supprimer en morceaux:
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 général, TRUNCATE est le meilleur moyen et je l'utiliserais si possible. Mais il ne peut pas être utilisé dans tous les scénarios. Notez également que TRUNCATE réinitialisera la valeur IDENTITY de la table s'il y en a une.
Si vous utilisez SQL 2000 ou une version antérieure, la condition TOP n'est pas disponible, vous pouvez donc utiliser SET ROWCOUNT à la place.
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
Vous pouvez annuler une troncature si vous êtes toujours dans la portée de la transaction que vous avez effectuée, contrairement à la croyance populaire qu'elle est transactionnelle pas supprimé jusqu'à la validation afin qu'il puisse être annulé en rétablissant l'IAM. – Andrew
Il suffit de le lire, et vous avez raison, dans SQL Server, vous pouvez restaurer un tronqué. J'avais oracle à l'esprit où ce n'est pas possible (selon la documentation). –
Je ne peux pas utiliser TRUNCATE parce que MyTable a une clé étrangère J'ai aussi besoin de la clause WHERE pour les données de filtre –