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 次在每个数据库与表中。

编辑简单的例子只是针对我的一个随机服务器运行,我知道只有一个数据库有一个 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
于 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 回答