【问题标题】:SQL Query Buffer in result - Show one by one结果中的 SQL 查询缓冲区 - 一个一个显示
【发布时间】:2017-12-01 20:28:00
【问题描述】:

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

【问题讨论】:

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

标签: sql sql-server sqlresultsetmapping


【解决方案1】:

如果您不想将其用于当前数据库,请尝试这样做:

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

【讨论】:

  • 谢谢,但这一下子就给出了输出。仍然感谢您的宝贵回答。
【解决方案2】:

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

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

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

【讨论】:

  • 它会显示一个数据库的 dbcc 结果然后跳转到另一个数据库吗?而不是一次显示所有 dbcc checkdb 结果。 ???
【解决方案3】:

正如 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

【讨论】:

  • 感谢您的回答。我改进了以下代码的答案,因为您的代码使 sql 跳过了所有数据库。因为我的 owner_sid 对所有人都是一样的。
猜你喜欢
  • 2011-07-26
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
相关资源
最近更新 更多