代码之家  ›  专栏  ›  技术社区  ›  Paul Talbot

sp msforeachdb查询帮助

  •  0
  • Paul Talbot  · 技术社区  · 14 年前

    我正在处理许多相同的数据库,所以我使用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 回复  |  直到 14 年前
        1
  •  2
  •   Damien_The_Unbeliever    14 年前

    您可以在每个数据库中使用对sp msforeachtable的调用,在该调用中,您可以使用@where and参数筛选出您感兴趣的表-它不会存在于您不感兴趣的数据库中,因此sp msforeachtable将在其中运行0次,在每个数据库中运行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
    
        2
  •  0
  •   Paul Talbot    14 年前

    在不信的达米安的帮助下解决

    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