我有一个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
然后它应该为master显示'dbcc checkdb'结果。
相反,结果会在未定义的时间内挂起,然后突然显示所有数据库的所有结果。 我正在使用MS SQL Server 2008。
答案 0 :(得分:1)
为避免缓冲结果,您可以使用严重性为0的RAISERROR...WITH NOWAIT
来生成信息消息:
RAISERROR ('Checking database %s', 0, 0, @var) WITH NOWAIT;
如果有前面的缓冲结果,例如来自DBCC输出,那么这些结果也会被RAISERROR...WITH NOWAIT
刷新。
答案 1 :(得分:1)
如果您不想将其用于当前数据库,请尝试执行以下操作:
exec('dbcc checkdb (' + @var + ', NOINDEX)')
答案 2 :(得分:0)
正如Dan Guzman所说,你可以使用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