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)')
我有一个 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)')