Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ребята, вопрос про циклы.  [new]
Колян Козлов
Member

Откуда:
Сообщений: 98
Добрый день,

подскажите как грамотно сделать удаление из таблички в цикле, порциями.



Сейчас делаю так:

WHILE ((SELECT COUNT(*) FROM table WHERE id=1)>0)
BEGIN
PRINT 'таки удаляю...';
BEGIN TRANSACTION
DELETE TOP (100000)
FROM table
WHERE id=1 ;
commit;
END



Но SSMS не пишет никаких сообщений пока выполняется цикл.

Т.е. тупо сидишь и смотришь в монитор в сообщения - а там пусто.

Собощения появляются только когда либо цикл завершился, либо когда нажимаю "стоп" на запросе.




Как получать актуальную информацию о процессе выполнении цикла?
14 фев 18, 12:01    [21190347]     Ответить | Цитировать Сообщить модератору
 Re: Ребята, вопрос про циклы.  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Колян Козлов, RAISERROR (N'таки удаляю...', 0, 1) WITH NOWAIT
14 фев 18, 12:04    [21190362]     Ответить | Цитировать Сообщить модератору
 Re: Ребята, вопрос про циклы.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Колян Козлов,

я предпочитаю что-то типа

DECLARE @R INT
WHILE 1 = 1
BEGIN

	DELETE TOP (100000)
	FROM #table
	WHERE id=1 ;
	
	SET @R = @@ROWCOUNT
	
	IF @R = 0 
		BREAK

	RAISERROR (N'таки удаляю... %d', 0, 1,@R) WITH NOWAIT
END
14 фев 18, 12:12    [21190398]     Ответить | Цитировать Сообщить модератору
 Re: Ребята, вопрос про циклы.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Del: DELETE TOP(100000) #table WHERE id=1;
IF @@ROWCOUNT>0 GOTO Del;
14 фев 18, 12:20    [21190438]     Ответить | Цитировать Сообщить модератору
 Re: Ребята, вопрос про циклы.  [new]
Колян Козлов
Member

Откуда:
Сообщений: 98
Ребята, большое спасибо!
14 фев 18, 12:28    [21190465]     Ответить | Цитировать Сообщить модератору
 Re: Ребята, вопрос про циклы.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap,

и без меток :)

SELECT NULL 
WHILE @@ROWCOUNT>0 DELETE TOP(100000) #table WHERE id=1;
14 фев 18, 12:30    [21190474]     Ответить | Цитировать Сообщить модератору
 Re: Ребята, вопрос про циклы.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
TaPaK
iap,

и без меток :)

SELECT NULL 
WHILE @@ROWCOUNT>0 DELETE TOP(100000) #table WHERE id=1;
И куда NULL вылезет?
14 фев 18, 12:41    [21190514]     Ответить | Цитировать Сообщить модератору
 Re: Ребята, вопрос про циклы.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap,

ну надо ж как-то толкнуть @@ROWCOUNT
14 фев 18, 12:45    [21190540]     Ответить | Цитировать Сообщить модератору
 Re: Ребята, вопрос про циклы.  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
TaPaK
iap,

ну надо ж как-то толкнуть @@ROWCOUNT
Вот из-за этого-то я и подумал несколько лет назад, что лучше @@ROWCOUNT проверять после операции, - и прыгать в начало в случае чего!
А что, GOTO сильно смущает? Это мой любимый оператор со времён FORTRANа!
14 фев 18, 12:48    [21190558]     Ответить | Цитировать Сообщить модератору
 Re: Ребята, вопрос про циклы.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap
TaPaK
iap,

ну надо ж как-то толкнуть @@ROWCOUNT
Вот из-за этого-то я и подумал несколько лет назад, что лучше @@ROWCOUNT проверять после операции, - и прыгать в начало в случае чего!
А что, GOTO сильно смущает? Это мой любимый оператор со времён FORTRANа!


та не, в sql он точно никогда не смущает :)
14 фев 18, 12:49    [21190568]     Ответить | Цитировать Сообщить модератору
 Re: Ребята, вопрос про циклы.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1364
И куда NULL вылезет?


можно и без паразитного селекта :)

declare @x int = 0;
while @@rowcount > 0 DELETE TOP (100000) FROM table;
14 фев 18, 13:14    [21190692]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить