我有一个SQL脚本如下:SQL查询缓冲区中的结果 - 显示一一
我希望得到的结果一个接一个。 例如,当@var被设置为'master'时。它应该显示:
Checking database master
然后它应该显示主dbcc checkdb结果。
相反的结果挂起不确定的时间,然后突然将显示所有数据库中的所有结果。 我为此使用MS SQL Server 2008。
我有一个SQL脚本如下:SQL查询缓冲区中的结果 - 显示一一
我希望得到的结果一个接一个。 例如,当@var被设置为'master'时。它应该显示:
Checking database master
然后它应该显示主dbcc checkdb结果。
相反的结果挂起不确定的时间,然后突然将显示所有数据库中的所有结果。 我为此使用MS SQL Server 2008。
正如丹·古斯曼说,你可以使用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
感谢您的回答。当你的代码使sql跳过所有数据库时,我对下面的代码进行了精炼。由于owner_sid在我的情况下都是相同的。 –
为了避免缓冲效果,则可以使用RAISERROR...WITH NOWAIT
严重性0,以产生一个信息的消息:如果有缓冲的结果,如从DBCC输出前述
RAISERROR ('Checking database %s', 0, 0, @var) WITH NOWAIT;
,那些也将通过RAISERROR...WITH NOWAIT
冲洗。
它会显示一个数据库的dbcc结果,然后跳转到另一个数据库吗?而不是一次显示所有的dbcc checkdb结果。 ??? –
@SumitSingh,是的。我相应地更新了我的答案。 –
如果你想用它不适合当前的数据库,尝试这样做:
exec('dbcc checkdb (' + @var + ', NOINDEX)')
什么主要问题是什么?您试图调用dbcc checkdb而不是当前数据库或打印结果? –