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)')