【发布时间】:2010-10-05 06:47:52
【问题描述】:
我在哪里,我们有一个在大型机系统上运行的软件包。大型机每晚都会转储到 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 列,但除此之外它工作得很好。
除非我今天有另一个非常好的主意,否则我想把它变成一个存储过程,并将一个版本组合成一个表值函数,使用一个临时表将所有结果放在一个结果集中(仅适用于选择查询) .
【问题讨论】:
标签: sql-server tsql sp-msforeachdb