Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 关于sp_msforeachdb类查询的帮助_Sql Server_Tsql_Sp Msforeachdb - Fatal编程技术网

Sql server 关于sp_msforeachdb类查询的帮助

Sql server 关于sp_msforeachdb类查询的帮助,sql-server,tsql,sp-msforeachdb,Sql Server,Tsql,Sp Msforeachdb,在我这里,我们有一个运行在大型机系统上的软件包。大型机每晚将数据转储到sql server中,这样我们的每个客户机在服务器中都有自己的数据库。服务器实例中还有一些其他数据库,加上一些没有数据的旧客户机数据库 我们通常需要在所有客户机上运行报告或检查数据。我希望能够使用sp_msforeachdb或类似的工具运行查询,但我不确定如何从列表中过滤不需要的数据库。你有什么想法吗 我们仍然使用SQLServer2000,但几个月后应该会转移到2005年 更新: 我想我问这个问题做得很糟糕,所以我要澄清

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

我们通常需要在所有客户机上运行报告或检查数据。我希望能够使用sp_msforeachdb或类似的工具运行查询,但我不确定如何从列表中过滤不需要的数据库。你有什么想法吗

我们仍然使用SQLServer2000,但几个月后应该会转移到2005年


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

我想在这里完成的是,让从事查询工作的程序员可以轻松地使用一个客户机数据库编写查询,然后几乎立即在所有50个左右的客户机数据库上运行(测试)在一个客户机数据库上设计和构建的代码,几乎不需要修改

考虑到这一点,以下是我目前在ManagementStudio中的代码(部分模糊):

这样做的好处是,只需将@sql变量设置为查询文本。非常容易转换为存储过程。它是动态sql,但同样:它只用于开发(著名的最后一句话;))。缺点是,您仍然需要对查询中使用的单引号进行转义,大多数情况下,您最终会在选择列表中添加一个额外的
'''?'作为ClientDB
列,但除此之外,它工作得很好


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

我们的每个数据库服务器都包含一个“DBA”包含像这样充满元数据的表的数据库

“databases”表将保存服务器上所有数据库的列表,您可以放置标志列来指示数据库状态(live、archive、system等)

然后,脚本要做的第一件事就是转到DBA数据库,获取它应该运行的所有数据库的列表


我们甚至有一个夜间维护脚本,确保服务器上的所有数据库也被输入到我们的“DBA.databases”表中,并在它们没有输入时提醒我们。(因为向该表中添加一行应该是一个手动过程)

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

“databases”表将保存服务器上所有数据库的列表,您可以放置标志列来指示数据库状态(live、archive、system等)

然后,脚本要做的第一件事就是转到DBA数据库,获取它应该运行的所有数据库的列表


我们甚至有一个夜间维护脚本,确保服务器上的所有数据库也被输入到我们的“DBA.databases”表中,并在它们没有输入时提醒我们。(因为向该表中添加一行应该是一个手动过程)

如何获取spmsforeachdb的定义,并根据您的目的对其进行调整?要获取定义,您可以运行以下命令(先按ctrl-T将结果窗格置于文本模式):


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

我们来看看spmsforeachdb的定义,然后根据您的目的对其进行调整,怎么样?要获取定义,您可以运行以下命令(先按ctrl-T将结果窗格置于文本模式):


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

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

EXEC    sp_msforeachdb  "
IF      '?'     NOT IN ('DBs','to','exclude')   BEGIN
        EXEC    sp_whatever_you_want_to
END
"

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

EXEC    sp_msforeachdb  "
IF      '?'     NOT IN ('DBs','to','exclude')   BEGIN
        EXEC    sp_whatever_you_want_to
END
"

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

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

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

您可以在此处免费获取代码:


我们的系统基于这段代码。

在2005 SSIS包中,做这种事情非常简单。也许您可以在某个服务器上设置一个实例

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

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

您可以在此处免费获取代码:


我们的系统基于此代码。

我最终使用了一个非常类似于此的解决方案。我最终使用了一个非常类似于此的解决方案。
EXEC    sp_msforeachdb  "
IF      '?'     NOT IN ('DBs','to','exclude')   BEGIN
        EXEC    sp_whatever_you_want_to
END
"