Обход буфера RAISERROR WITH NOWAIT

Я использую RAISERROR для получения вывода о ходе выполнения хранимых процедур, а не использую PRINT, чтобы избежать буферизации вывода PRINT. Теперь я обнаружил, что RAISERROR начинает буферизацию после 500 отпечатков. Есть ли способ обойти это поведение? Следующий запрос покажет мою точку зрения:

DECLARE @i INT = 0

WHILE @i < 50000
BEGIN
    SET @i = @i + 1 

    RAISERROR('%i prints', 0,1 , @i) with nowait;

    IF @i > 500  --<--after 500 prints RAISERROR starts buffering 50 prints before flushing.
    WAITFOR DELAY '00:00:00.050';
END; 

person jhe    schedule 09.09.2014    source источник
comment
Рассматривали ли вы инструментирование хранимых процедур с записью в таблицу журнала вместо того, чтобы полагаться на вывод клиентской строки? Если вам нужна поддержка автономных транзакций, вы можете использовать трюк с петлевыми серверами (dbbest .com/blog/autonomous-transactions-sql-server)   -  person N West    schedule 09.09.2014
comment
Я использую сценарии для резервного копирования и восстановления сотен баз данных и хотел бы, чтобы вывод о ходе выполнения распечатывался, а не регистрировался в таблице, поскольку вывод о ходе выполнения из BACKUP и RESTORE является printet   -  person jhe    schedule 09.09.2014
comment
@NWest Вы можете использовать переменную @table, которая невосприимчива к откатам транзакций, чтобы не нуждаться во всевозможных отвратительных обходных путях.   -  person Aaron Bertrand    schedule 09.09.2014


Ответы (2)


Эрланд Зоммерсканд сообщил :

Однако имейте в виду, что Mgmt Studio начинает буферизировать также сообщения NOWAIT после 500 сообщений.

Этого не происходит со старым анализатором запросов, поставляемым с SQL 2000.

Если у вас нет QA, возможно, вы могли бы попробовать SQLCMD.EXE вместо SSMS. Может быть, он не будет делать буферизацию после 500.

person Ross Presser    schedule 09.09.2014
comment
То же самое с SQLCMD.EXE, и я полагаю, что не могу использовать QA с SQL Server 2008?! - person jhe; 09.09.2014
comment
@jhe, конечно, вы можете использовать Query Analyzer с SQL Server 2008, просто не пытайтесь делать слишком много в дополнение к тому, что он служит тупым окном запроса. Enterprise Mangler будет другой историей. - person Aaron Bertrand; 09.09.2014

Я помню, как пробовал это в LINQpad, linqpad может принимать необработанный sql, а буфера не было.

и я только что попробовал еще раз, и я могу подтвердить это.

можно ли использовать линкпад?

person Fredou    schedule 09.09.2014
comment
Это может быть решением, но так как это часто происходит в продакшене, нам не всегда разрешено устанавливать программное обеспечение. - person jhe; 09.09.2014
comment
@jhe, вам не нужно устанавливать linqpad, вы можете загрузить zip-файл с веб-сайта linqpad (автономно), просто извлечь его, а затем запустить, и все это без установки - person Fredou; 09.09.2014
comment
Кроме того, вы можете разместить клиент LINQpad на любом компьютере разработчика, имеющем соединение SQL; это не обязательно должно быть на рабочем сервере. - person Ross Presser; 13.11.2014