Sql server 如何在同一查询中同时使用sp_msforeachtable和sp_msforeachdb?

Sql server 如何在同一查询中同时使用sp_msforeachtable和sp_msforeachdb?,sql-server,sql-server-2008,sp-msforeachdb,sp-msforeachtable,Sql Server,Sql Server 2008,Sp Msforeachdb,Sp Msforeachtable,是否有任何方法可以引用在“sp_msforeachdb”循环中运行的“sp_MSforeachtable”循环中的表 例如,在以下查询中,“?”始终引用数据库: DECLARE @cmd VARCHAR(8000); SET @cmd = 'USE ?; EXEC sp_MSforeachtable @command1="select db_name = DB_NAME(), db_foreach = ''?'', tb_foreach = ''?'' "' EXEC sp_msforeac

是否有任何方法可以引用在“sp_msforeachdb”循环中运行的“sp_MSforeachtable”循环中的表

例如,在以下查询中,“?”始终引用数据库:

DECLARE @cmd VARCHAR(8000);

SET @cmd = 'USE ?; EXEC sp_MSforeachtable @command1="select db_name = DB_NAME(), db_foreach = ''?'', tb_foreach = ''?'' "'

EXEC sp_msforeachdb @command1 =@cmd
导致:

 db_name        db_forearch    tb_foreach
 ServerMonitor  master         master
我想要一些像:

 db_name        db_forearch    tb_foreach
 ServerMonitor  master         <TABLE_NAME>

对于你正在做的事情,你可以这样做。尽管这仍然在为每个可能有问题的db过程使用。您需要在最终的select语句中添加where子句,以过滤掉一些数据库(model、tempdb、master等)


查看sp_msforeachtable的参数。其中一个是@replacechar,默认情况下,它是一个问号(即?)。请随意传入另一个同样不太可能出现在查询中的字符(可能是^)

当然,如果我没有提到,根据您试图做的事情(我认为您试图在所有表上做的任何事情都是可以通过这种方式完成的),powershell中有更易于阅读(和编写)的解决方案,那我就是失职了:

import-module sqlps -disablenamechecking;
$s = new-object microsoft.sqlserver.management.smo.server '.';
foreach ($db in $s.databases) {
   foreach ($table in $db.Tables) {
      $table | select parent, name; --merely list the table and database
   }
}

您只是想从每个数据库中获取每个表名吗?不是。我的目标有点复杂(我想运行一个基于sp_space的脚本,该脚本用于数据库中的每个表)。这个例子只是为了让大家更容易理解。为什么不滚动你自己的光标而不是每个数据库?无论如何,这一过程存在一些问题。它并不总是能找到每个数据库。我认为以后使用这些未记录的存储过程会更容易理解。也许我错了。我将用我自己的光标来写它。谢谢
declare @TableNames table
(
    DatabaseName sysname
    , TableName sysname
)
    insert @TableNames
    EXEC sp_msforeachdb @command1 = 'use ?;select ''?'', name from sys.tables'

select *, 'exec ' + Databasename + '..sp_spaceused [''' + TableName + ']'';' 
from @TableNames
import-module sqlps -disablenamechecking;
$s = new-object microsoft.sqlserver.management.smo.server '.';
foreach ($db in $s.databases) {
   foreach ($table in $db.Tables) {
      $table | select parent, name; --merely list the table and database
   }
}