0

私は同じデータベースをたくさん使用しているので、テーブルから情報を取得できるように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
4

2 に答える 2

2

各データベース内でsp_MSforeachtableの呼び出しを使用できます。ここで、@ WhereAndパラメーターを使用して、関心のあるテーブルのみにフィルターをかけます。関心のないデータベースには存在しないため、sp_MSforeachtableが実行されます。そこに0回、テーブルのある各データベースに1回。

Edit Simpleの例は、私のランダムなサーバーに対して実行するだけです。ここでは、1つのデータベースだけがClientID列を持つtblClientテーブルを持っていることがわかっていました(名前を付けないでください)。

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
于 2010-10-01T08:57:21.273 に答える
0

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
于 2010-10-01T09:19:33.277 に答える