2010-10-01 47 views
0

我正在處理大量相同的數據庫,因此我正在使用sp_MSforeachdb過程,以便可以從表中檢索信息。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

你可以用它來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

因此,將sp_MSforeachtable包裝在sp_MSforeachdb的@ command1中? – 2010-10-01 09:02:15

+0

@Sres - yep。引號可能有點令人困惑,當然,你需要爲其中一個存儲過程指定@replacechar – 2010-10-01 09:06:26

+0

現在,我遇到了模糊列名'name'的問題,我已將別名中的sysobjects別名上面,@where和什麼表是? – 2010-10-01 09:07:53

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