Как использовать инструкцию PRINT для отслеживания выполнения в качестве хранимой процедуры?
Ссылка: SQL Server
У меня есть хранимая процедура с циклом while
в нем, и я хочу, чтобы некоторые сообщения печатались после каждых 500 циклов.
Итак, я написал -
CREATE spxxx
AS
BEGIN
BEGIN TRAN
DECLARE @counter = 0;
WHILE <somecondition>
SET @counter = @counter + 1;
IF @counter % 50 = 0
BEGIN
PRINT @counter;
END
END
COMMIT TRAN
END -- End spxxx
Но он печатает все сообщения после завершения процесса. Я хочу, чтобы он печатал сообщения во время работы.
Ответы
Ответ 1
Я уверен, вы можете использовать RAISERROR... WITH NOWAIT
Если вы используете серьезность 10, это не ошибка. Это также обеспечивает удобное форматирование, например% s,% i, и вы также можете использовать состояние, чтобы отслеживать, где вы находитесь.
Ответ 2
SQL Server возвращает сообщения после выполнения партии операторов. Обычно вы используете SQL GO
для указания конца партии и для получения результатов:
PRINT '1'
GO
WAITFOR DELAY '00:00:05'
PRINT '2'
GO
WAITFOR DELAY '00:00:05'
PRINT '3'
GO
В этом случае, однако, оператор печати, который вы хотите вернуть сразу, находится в середине цикла, поэтому операторы печати не могут находиться в их собственной партии. Единственная команда, которую я знаю об этом, вернется посредине пакета RAISERROR (...) WITH NOWAIT
, который gbn предоставил в качестве ответа, когда я набираю это.
Ответ 3
Можно ли просто спросить о долгосрочной потребности в этом объекте - это для целей отладки?
Если это так, то вы можете захотеть использовать подходящий отладчик, например, тот, который найден в Visual Studio, так как это позволяет вам выполнять процедуру более контролируемым образом и избегает необходимости постоянно добавлять/удалять PRINT из процедуры.
Просто мое мнение, но я предпочитаю подход отладчика - для кода и баз данных.