Jeśli trzeba ograniczyć do tego, co wiersze trzeba usunąć, a nie zrobić kompletnym usunąć lub nie można używać truncate table (np tabela odwołuje się ograniczenie FK lub zawarte w widoku indeksowanego), a następnie można wykonać usuwać w kawałkach:
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
ogólnie obcina jest najlepszy sposób i użyłbym tego, jeśli to możliwe. Ale nie można go stosować we wszystkich scenariuszach. Zwróć też uwagę, że TRUNCATE zresetuje wartość IDENTITY dla tabeli, jeśli taka istnieje.
Jeśli korzystasz z SQL 2000 lub wcześniejszych, warunek TOP nie jest dostępny, więc możesz użyć SET ROWCOUNT zamiast tego.
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
Możesz wycofać skasowanie, jeśli nadal jesteś w zakresie transakcji, w którym go wykonywałeś, wbrew powszechnej opinii, że jest on transakalizowany - zwolniony IAM jest nie jest usuwany do czasu zatwierdzenia, więc można go wycofać, przywracając IAM. – Andrew
Po prostu przeczytaj, a masz rację, na serwerze sql możesz wycofać skrócone. Miałem na myśli wyrocznię, gdzie nie jest to możliwe (zgodnie z dokumentacją). –
Nie mogę używać TRUNCATE, ponieważ MyTable ma również klucz obcy Potrzebuję klauzuli WHERE dla danych filtrów –