Подтвердить что ты не робот

Как использовать инструкцию 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

Но он печатает все сообщения после завершения процесса. Я хочу, чтобы он печатал сообщения во время работы.

4b9b3361

Ответ 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 из процедуры.

Просто мое мнение, но я предпочитаю подход отладчика - для кода и баз данных.