3

'sp_msforeachtdb'루프 내에서 실행되는 'sp_MSforeachtable'루프 내에서 테이블을 참조 할 수있는 방법이 있습니까?sp_msforeachtable과 sp_msforeachdb를 같은 쿼리에서 사용하는 방법은 무엇입니까?

예를 들어, 다음 쿼리에서 '?'

db_name  db_forearch tb_foreach 
ServerMonitor master   <TABLE_NAME> 

내가 무엇을 변경해야합니다 :

db_name  db_forearch tb_foreach 
ServerMonitor master   master 

내가 좋아하는 무언가를 갖고 싶어 :

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] 

이 결과 : 항상 데이터베이스를 참조하는?


해결. 나는 Sean이 제안한 것처럼 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

각 데이터베이스에서 모든 테이블 이름을 가져 오려고합니까? –

+0

Nope. 내 목표는 좀 더 복잡합니다 (데이터베이스의 모든 테이블에 대해 sp_spaceused를 기반으로 스크립트를 실행하고 싶습니다). 이 예는 이해하기 쉽도록하기위한 것입니다. – Michael

+0

왜 각 데이터베이스 대신 자신의 커서를 굴리는 것이 좋을까요? 어쨌든 그 절차에는 몇 가지 문제가 있습니다. 항상 모든 데이터베이스를 찾지는 않습니다. http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx –

답변

2

를 필터링 최종 select 문에 where 절을 추가 할 것입니다. 그 중 하나는 @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

당신이하는 일에 대해 이와 같이 할 수 있습니다. 이것은 여전히 ​​문제가 될 수있는 각 db 프로 시저에 대해 사용하고 있지만. 당신은 sp_msforeachtable에 대한 매개 변수를 살펴 보자 일부 데이터베이스 (모델, 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