结果中的SQL查询缓冲区-逐个显示

结果中的SQL查询缓冲区-逐个显示,sql,sql-server,sqlresultsetmapping,Sql,Sql Server,Sqlresultsetmapping,我有一个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 dat

我有一个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的NOWAIT
RAISERROR…生成信息消息:

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

如果存在前面的缓冲结果,例如来自DBCC输出的结果,那么这些结果也将被
RAISERROR刷新…使用NOWAIT

,正如Dan Guzman所说,您可以使用
RAISERROR
。 但是,您不能
EXEC('use'+@var)
和以后使用
dbcc checkdb
。这两条语句在不同的批中执行,因此dbcc始终在当前连接上执行。试试下面的方法,它对我很有用(sql server 2012/2014)。我还稍微更改了光标,以排除Microsoft拥有的表(主表、模型等)。如果你想检查这些,你知道怎么做: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
DECLARE@text-NVARCHAR(100)=“正在检查数据库”
,@ErrorText NVARCHAR(100)
,@var varchar(最大值)
为游标声明db_列表
从sys.databases中选择名称
其中所有者\u sid 0x01
打开数据库列表
从db_列表获取下一个到@var
打印@var
而(@@FETCH\u STATUS=0)
开始
设置@ErrorText=@text+@var
使用NOWAIT的RAISERROR(@ErrorText,0,0)
使用NOWAIT的RAISERROR(“-------------------------------------------------------------”,0,0)
EXEC('use'+@var+';dbcc checkdb')
从db_列表获取下一个到@var
结束
关闭数据库列表
解除分配db_列表

如果不想将其用于当前数据库,请尝试执行以下操作:

exec('dbcc checkdb (' + @var + ', NOINDEX)')

它会显示一个数据库的dbcc结果,然后跳转到另一个数据库吗?而不是一次显示所有dbcc checkdb结果???主要问题是什么?您试图调用dbcc checkdb而不是当前数据库或打印结果?谢谢您的回答。我改进了以下代码的答案,因为您的代码使sql跳过了所有数据库。因为在我的例子中,owner_sid对所有人都是相同的。谢谢,但这会同时给出所有输出。还是谢谢你宝贵的回答。