3

有沒有什麼辦法可以在'sp_msforeachdb'循環內運行'sp_MSforeachtable'循環內引用表?如何在同一查詢中同時使用sp_msforeachtable和sp_msforeachdb?

例如,在下面的查詢中,'?'總是引用數據庫:

DECLARE @cmd VARCHAR(8000); 

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

EXEC sp_msforeachdb @command1 [email protected] 

結果造成:

db_name  db_forearch tb_foreach 
ServerMonitor master   master 

我想有這樣的:

db_name  db_forearch tb_foreach 
ServerMonitor master   <TABLE_NAME> 

我應該怎麼改?


已解決。按照肖恩的建議,我使用了我的ow遊標。但Ben Thul提出的@replacechar解決方案正是我所期待的。

DECLARE @cmd VARCHAR(8000); 

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

EXEC sp_msforeachdb @command1 [email protected], @replacechar = '^' 
+0

你只是試圖從每個數據庫中獲取每個表名? – 2014-12-02 14:40:58

+0

沒有。我的目標有點複雜(我想爲sp_spaceused爲數據庫中的每個表運行腳本)。這個例子只是爲了更容易理解。 – Michael 2014-12-02 15:47:16

+0

爲什麼不直接推出自己的遊標而不是每個數據庫?無論如何,這個程序有一些問題。它並不總是找到每個數據庫。 http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx – 2014-12-02 15:56:11

回答

2

看看爲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 
    } 
} 
0

對於你在做什麼,你可以做這樣的事情。雖然這仍然使用每個數據庫程序可能有問題。您將要where子句加入到最終的select語句來過濾掉一些數據庫(模型,tempdb中,碩士等)

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 
相關問題