1

在我所在的地方,我们有一个在大型机系统上运行的软件包。大型机每晚都会转储到 sql server 中,这样我们的每个客户端在服务器中都有自己的数据库。服务器实例中还有一些其他数据库,以及一些没有数据的旧客户端数据库。

我们经常需要跨所有客户端运行报告或检查数据。我希望能够使用 sp_msforeachdb 或类似的东西运行查询,但我不确定如何从列表中过滤不需要的数据库。关于这如何工作的任何想法?

我们仍在使用 SQL Server 2000,但几个月后应该会迁移到 2005。


更新:
我认为我在问这个问题时做得很糟糕,所以我要澄清我的目标,然后发布我最终使用的解决方案。

我想在这里完成的是让从事查询以在他们的程序中使用的程序员更容易使用一个客户端数据库编写查询,然后几乎立即运行(测试)在所有 50 个客户端的数据库上设计和构建的代码左右客户端数据库,几乎没有修改。

考虑到这一点,这是我目前位于 Management Studio 中的代码(部分混淆):

use [master]
declare @sql varchar(3900) 

set @sql = 'complicated sql command added here'

-----------------------------------
declare @cmd1 varchar(100)
declare @cmd2 varchar(4000)
declare @cmd3 varchar(100)
set @cmd1 = 'if ''?'' like ''commonprefix_%'' raiserror (''Starting ?'', 0, 1) with nowait'
set @cmd3 = 'if ''?'' like ''commonprefix_%'' print ''Finished ?'''
set @cmd2 = 
    replace('if ''?'' like ''commonprefix_%'' 
    begin 
        use [?]
        {0} 
    end', '{0}', @sql)

exec sp_msforeachdb @command1 = @cmd1, @command2 = @cmd2, @command3 = @cmd3

这样做的好处是您所要做的就是将@sql 变量设置为您的查询文本。很容易变成存储过程。它是动态 sql,但同样:它仅用于开发(著名的遗言;))。缺点是您仍然需要转义查询中使用的单引号,并且很多时候您最终会''?'' As ClientDB在选择列表中放置一个额外的列,但除此之外它工作得很好。

除非我今天有另一个非常好的主意,否则我想把它变成一个存储过程,并将一个版本组合成一个表值函数,使用一个临时表将所有结果放在一个结果集中(仅用于选择查询)。

4

4 回答 4

1

只需将要执行的语句包装在 IF NOT IN 中:

EXEC    sp_msforeachdb  "
IF      '?'     NOT IN ('DBs','to','exclude')   BEGIN
        EXEC    sp_whatever_you_want_to
END
"
于 2009-02-04T17:59:36.220 回答
0

我们的每个数据库服务器都包含一个“DBA”数据库,其中包含充满此类元数据的表。

“数据库”表将保留服务器上所有数据库的列表,您可以放置​​标志列来指示数据库状态(实时、存档、系统等)。

然后,您的 SCRIPT 所做的第一件事就是访问您的 DBA 数据库以获取它应该运行的所有数据库的列表。

我们甚至有一个夜间维护脚本,可以确保服务器上的所有物理数据库也都输入到我们的“DBA.databases”表中,如果没有,就会提醒我们。(因为向该表添加一行应该是手动过程)

于 2009-02-03T22:32:09.883 回答
0

采用 sp_msforeachdb 的定义并对其进行调整以适应您的目的怎么样?要获得定义,您可以运行它(首先按 ctrl-T 将结果窗格置于文本模式):

sp_helptext sp_msforeachdb

显然,您希望创建自己的存储过程版本,而不是覆盖原始版本;o)

于 2009-02-03T22:36:49.233 回答
0

在 2005 SSIS 包中执行此类操作非常简单。也许您可以在某处的服务器上设置一个实例。

我们设置了多台服务器,因此我们有一个表来指示将调查哪些服务器。然后,除其他事项外,我们拉回所有数据库的列表。这用于备份脚本。

您可以维护此数据库列表并为您自己的目的添加一些字段。您可以有另一个包或步骤,这取决于您如何决定要报告哪些数据库以及是否可以以编程方式完成。

您可以在这里免费获取代码: http ://www.sqlmag.com/Articles/ArticleID/97840/97840.html?Ad=1

我们的系统基于此代码。

于 2009-02-04T18:00:20.990 回答