SQL Query Buffer в результате - Показать один за другим

У меня есть сценарий SQL следующим образом:

declare db_list cursor  for
select name From sys.databases
open db_list 
declare @var varchar(MAX)
fetch next from db_list into @var
print @var
while (@@FETCH_STATUS = 0)
    BEGIN
        EXEC('use '+@var)
        print 'Checking database '+@var
        print '---------------------------------------------'
        dbcc checkdb
        fetch next from db_list into @var
    END
close db_list
deallocate db_list

Я хочу получить результат один за другим. Например, когда @var установлен на "master". Это должно показать:

Checking database master

а затем он должен показать результат 'dbcc checkdb' для мастера.

Вместо этого результат зависает на неопределенное время, а затем внезапно отображает все результаты для всех баз данных. Я использую MS SQL Server 2008 для этого.

3 ответа

Решение

Как сказал Дэн Гузман, вы можете использовать RAISERROR, Тем не менее, вы не можете EXEC('use '+@var) и позже использовать dbcc checkdb, Эти два оператора выполняются в разных пакетах, поэтому dbcc всегда выполняется для вашего текущего соединения. Попробуйте следующее, у меня это сработало (sql server 2012/2014). Я также немного изменил курсор, чтобы исключить таблицы, принадлежащие Microsoft (Master, Model и т. Д.). Если вы хотите, чтобы те проверили, вы знаете, что делать:P.

DECLARE @text NVARCHAR(100) = 'Checking database '
,       @ErrorText NVARCHAR(100)
,       @var varchar(MAX)

declare db_list cursor  FOR
select name From sys.databases
WHERE owner_sid <> 0x01
open db_list 

fetch next from db_list into @var
print @var
while (@@FETCH_STATUS = 0)
    BEGIN
        SET @ErrorText = @text + @var
        RAISERROR(@ErrorText, 0, 0) WITH NOWAIT
        RAISERROR('---------------------------------------------', 0, 0) WITH NOWAIT
        EXEC('use ' + @var + '; dbcc checkdb')
        fetch next from db_list into @var
    END
close db_list
deallocate db_list

Чтобы избежать буферизации результатов, вы можете использовать RAISERROR...WITH NOWAIT со степенью серьезности 0 для создания информационного сообщения:

RAISERROR ('Checking database %s', 0, 0, @var) WITH NOWAIT;

Если имеются предшествующие буферизованные результаты, например, из вывода DBCC, они также будут сброшены RAISERROR...WITH NOWAIT,

Если вы хотите использовать его не для текущей базы данных, попробуйте сделать это:

exec('dbcc checkdb (' + @var + ', NOINDEX)')
Другие вопросы по тегам