1

我有一个如下的 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。

4

3 回答 3

1

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

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

如果有先前缓冲的结果,例如来自 DBCC 输出,则这些结果也将由RAISERROR...WITH NOWAIT.

于 2017-06-28T13:14:24.380 回答
1

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

exec('dbcc checkdb (' + @var + ', NOINDEX)')
于 2017-06-28T13:25:35.123 回答
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
于 2017-06-28T13:18:09.057 回答