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

SQL Query Buffer in result - Show one by one

我有一个 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' master 的结果。

相反,结果挂起未定义的时间,然后突然显示所有数据库的所有结果。 为此,我正在使用 MS SQL Server 2008。

为避免缓冲结果,您可以使用严重性为 0 的 RAISERROR...WITH NOWAIT 来生成信息消息:

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

如果前面有缓冲结果,例如来自 DBCC 输出的结果,这些结果也将被 RAISERROR...WITH NOWAIT 刷新。

正如 Dan Guzman 所说,您可以使用 RAISERROR。 但是,您不能在 EXEC('use '+@var) 之后使用 dbcc checkdb。这两个语句以不同的批次执行,因此 dbcc 始终在您当前的连接上执行。尝试以下方法,它对我有用(sql 服务器 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

如果您不想将其用于当前数据库,请尝试这样做:

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