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

时间:2017-06-28 12:52:47

标签: 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 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。

3 个答案:

答案 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