2017-06-28 50 views
1

我有一个SQL脚本如下:SQL查询缓冲区中的结果 - 显示一一

我希望得到的结果一个接一个。 例如,当@var被设置为'master'时。它应该显示:

Checking database master 

然后它应该显示主dbcc checkdb结果。

相反的结果挂起不确定的时间,然后突然将显示所有数据库中的所有结果。 我为此使用MS SQL Server 2008。

+0

什么主要问题是什么?您试图调用dbcc checkdb而不是当前数据库或打印结果? –

回答

0

正如丹·古斯曼说,你可以使用RAISERROR。 但是,你不能EXEC('use '[email protected])并在以后使用dbcc checkdb。这两个语句以不同批次执行,因此dbcc始终在当前连接上执行。尝试以下,它为我工作(SQL Server 2012/2014)。我也改变了光标一点,以排除微软拥有的表(主,模型等)。如果你确实想要那些检查,你知道该怎么做: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 
+0

感谢您的回答。当你的代码使sql跳过所有数据库时,我对下面的代码进行了精炼。由于owner_sid在我的情况下都是相同的。 –

1

为了避免缓冲效果,则可以使用RAISERROR...WITH NOWAIT严重性0,以产生一个信息的消息:如果有缓冲的结果,如从DBCC输出前述

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

,那些也将通过RAISERROR...WITH NOWAIT冲洗。

+0

它会显示一个数据库的dbcc结果,然后跳转到另一个数据库吗?而不是一次显示所有的dbcc checkdb结果。 ??? –

+0

@SumitSingh,是的。我相应地更新了我的答案。 –

1

如果你想用它不适合当前的数据库,尝试这样做:

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