Мой сервер развертывания запускает сценарий развертывания для каждой новой сборки базы данных.Могу ли я печатать сразу для каждой итерации в цикле?
Часть блоков сценариев ждет завершения еще одной асинхронной операции.
код Блокирующий выглядит следующим образом:
DECLARE @i INT = 0;
DECLARE @laststatus NVARCHAR(MAX) = N'';
WHILE @i < 5
BEGIN
-- the real delay is longer
WAITFOR DELAY '00:00:01';
-- poll async operation status here
SET @i = @i + 1;
SET @laststatus = N'status is ' + CAST(@i AS NVARCHAR(MAX));
RAISERROR(@laststatus, 0, 1) WITH NOWAIT;
END;
Он использует положение о RAISERROR
вместо PRINT
WITH NOWAIT
потому, что он должен напечатать статус обновления для каждой итерации.
Сервер развертывания запускает скрипт в SQLCMD с этой командой:
sqlcmd.exe -i print_test.sql
Выход появляется сразу, как это:
статус 1
статус 2
статус 3
состояние 4
состояние 5
Он должен напечатать это после одной секунды:
статус 1
После очередного второго он должен напечатать этот
статус 2
И скоро.
Есть ли способ сделать это в sqlcmd?
Работает отлично для меня. Вы используете это в SSMS? Если вы нажмете на вкладку сообщений, как только начнется запрос? Фокус только устанавливается автоматически, когда запрос прекращает выполнение. –
BTW Вы также можете использовать 'RAISERROR (N'status is% i ', 0, 1, @i) WITH NOWAIT;' без промежуточной переменной. –
@MartinSmith Вы правы в SSMS. Мне нужно то же самое, что и в sqlcmd. Просто заметили, что они ведут себя по-другому для меня! Отредактировал вопрос, чтобы уточнить. –