Если вам нужно ограничиться тем, какие строки нужно удалить, и не выполнять полное удаление, или вы не можете использовать TRUNCATE TABLE (например, на таблицу ссылается ограничение FK или она включена в индексированное представление), Вы можете сделать удаление кусками:
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
Как правило, TRUNCATE - лучший способ, и я бы использовал его, если это возможно. Но это не может быть использовано во всех сценариях. Также обратите внимание, что TRUNCATE будет сбрасывать значение IDENTITY для таблицы, если она есть.
Если вы используете SQL 2000 или более раннюю версию, условие TOP недоступно, поэтому вы можете использовать вместо него 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