我正在使用大量相同的数据库,因此我使用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
答案 0 :(得分: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
答案 1 :(得分: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