3

Есть ли способ ссылаться на таблицу внутри цикла 'sp_MSforeachtable', запущенного внутри цикла 'sp_msforeachdb'?Как использовать как 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> 

Что я должен изменить?


Решено. Я использовал мой указатель, как предложил Шон. Но решение @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

Посмотрите на параметры для sp_msforeachtable. Одним из них является @replacechar, который по умолчанию является вопросительным знаком (т. Е.?). Не стесняйтесь передавать другой одинаково маловероятный персонаж в запросе (возможно, a ^).

Конечно, я бы отказался, если бы не упомянул об этом в зависимости от того, что вы пытаетесь сделать (и я бы сказал, что все, что вы пытаетесь сделать по всем столам, выполнимо таким образом) , легче читать (и писать) решения в 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, которая может быть проблематичной. Вы хотите добавить, где положение до конечного оператора выбора, чтобы отфильтровать некоторые базы данных (модель, 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 
Смежные вопросы