Справка по запросу sp_MSforeachdb - PullRequest
0 голосов
/ 01 октября 2010

Я работаю с множеством одинаковых баз данных, поэтому использую процедуру sp_MSforeachdb, чтобы получить информацию из таблицы.

Проблема, с которой я столкнулся, заключается в том, что существуют другие базы данных.на поле, в котором нет таблицы, поэтому я выкидываю недопустимые ошибки объекта.

Вот что у меня есть в данный момент, я фильтрую LoginDatabase, потому что у него та же таблица, но я неЯ не хочу этого в запросе.

Мой вопрос заключается в том, как я могу ограничить его только базами данных с таблицей, из которой я хочу получить информацию.

SET NOCOUNT ON

CREATE TABLE #tmpData
(
    DbName VARCHAR(30),
    DbVersion FLOAT
)

exec sp_msforeachdb @command1='
    USE ?;

    INSERT INTO #tmpData
    SELECT ''?'', (SELECT Setting 
        FROM ?.dbo.gl_SysParams 
        WHERE Keyword = ''DatabaseSchema'')
    FROM sysobjects o
    WHERE type=''U'' 
    AND [name] = ''gl_SysParams'' 
    AND ''?'' <> ''LoginDatabase'' ORDER BY [name]
    '   

SET NOCOUNT OFF

SELECT DbName, DbVersion FROM #tmpData ORDER BY DbName

DROP TABLE #tmpData

Ответы [ 2 ]

2 голосов
/ 01 октября 2010

Вы можете использовать вызов sp_MSforeachtable в каждой базе данных, где вы используете параметр @WhereAnd для фильтрации только до интересующей вас таблицы - она ​​не будет существовать в базе данных, которая вас не интересует, поэтому sp_MSforeachtable будет работать там 0 раз, и 1 раз в каждой базе данных с таблицей.

Редактировать Простой пример просто запустить на моем случайном сервере, где я знал, что только у одной базы данных была таблица tblClient со столбцом ClientID (простите за наименование):

create table #t (
    ID int not null
)
exec sp_MSforeachdb 'use ? exec sp_MSforeachtable ''insert into #t(ID) select ClientID from ~'',''~'',@whereand=''and o.name=''''tblClient''''''','?'
select * from #t
drop table #t
0 голосов
/ 01 октября 2010

Решение с помощью Damien_the_Unbeliever

SET NOCOUNT ON

CREATE TABLE #tmpData
(
    DbName VARCHAR(30),
    DbVersion FLOAT
)

exec sp_MSforeachdb @command1 = '
    USE ?;

    exec sp_MSforeachtable @command1 = ''INSERT INTO #tmpData
    SELECT ''''?'''', (SELECT Setting 
        FROM ?.dbo.gl_SysParams 
        WHERE Keyword = ''''DatabaseSchema'''')
    FROM sysobjects p
    WHERE type=''''U'''' 
    AND p.[name] = ''''gl_SysParams'''' 
    AND ''''?'''' <> ''''LoginDatabase'''' ORDER BY [name]
    '',
    @whereand = ''AND o.[name] = ''''gl_SysParams''''''
    '

SET NOCOUNT OFF

SELECT DbName, DbVersion FROM #tmpData ORDER BY DbName

DROP TABLE #tmpData
...