5

「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>

何を変更すればよいですか?


解決しました。Sean が提案したように、ow カーソルを使用しました。しかし、Ben Thul によって提案された @replacechar ソリューションは、まさに私が探していたものです。

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, @replacechar = '^'
4

2 に答える 2

3

sp_msforeachtable のパラメーターを見てください。それらの 1 つは @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
   }
}
于 2014-12-02T16:56:18.847 に答える