查找具有特定表的数据库或在SQL Server的每个数据库中查找表

时间:2011-01-19 08:32:00

标签: sql sql-server

我有一个包含数百个数据库的SQL Server,每个数据库都有数百个表。 现在我想在这些数据库中找到我正在寻找的表格。

我可以使用

找到个人数据库中是否存在表格
use myDatabase 
select * from sys.tables  where name = 'mytable' 
GO

但使用这意味着我必须手动更改数据库数百次。 我想只找到数据库名称。 有出路吗?

7 个答案:

答案 0 :(得分:15)

好的,如果您只是想找到包含特定表的每个数据库,并且不打算查询表,那么您可以这样做:

create table #t (
    DBName sysname not null
)
go
exec sp_MSforeachdb 'use [?]; if OBJECT_ID(''dbo.mytable'') is not null insert into #t (DBName) select ''?'''
go
select * from #t
go
drop table #t

(如果您没有在数据库中使用多个模式,则无需在OBJECT_ID调用中指定dbo,否则我会使用它来避免在错误的模式中查找表格。

答案 1 :(得分:14)

这应该可以满足您的需求:

EXEC sp_MSforeachdb "use [?];select * from sys.tables where name='TableName' "

要在输出中包含当前数据库的名称:

EXEC sp_MSforeachdb "use [?];select '[?]' as DatabaseName, * from sys.tables where name='TableName' "

答案 2 :(得分:6)

SELECT DISTINCT  DB_NAME(database_id)
FROM [sys].[dm_db_index_operational_stats](NULL,NULL,NULL,NULL) 
WHERE OBJECT_NAME(object_id,database_id) = 'mytable'

答案 3 :(得分:3)

我知道这是一个老线程,但我的谷歌搜索很高。所以我想为其他人寻找有特定表格的数据库做出贡献。这些适用于SQL Server 2008 - Current。

我从这开始,这适用于我的SA级别登录,但是给了我对没有所有数据库权限的用户的问题。

SELECT name
FROM sys.databases
WHERE CASE
WHEN state_desc = 'ONLINE' THEN OBJECT_ID( QUOTENAME( name ) + '.[dbo].[mytablename]','U' )
END IS NOT NULL;

但结果是在限制中添加了HAS_DBACCESS(name) = 1,以便查询不会因安全性错误而失败。

SELECT name
FROM sys.databases
WHERE HAS_DBACCESS(name) = 1 and
CASE
WHEN state_desc = 'ONLINE' THEN OBJECT_ID( QUOTENAME( name ) + '.[dbo].[mytablename]','U' )
END IS NOT NULL;

答案 4 :(得分:1)

exec sp_msforeachdb @command1='     
USE ?;
select * from sys.tables where name = ''CLIENTS'''    

答案 5 :(得分:0)

这也是方法之一,类似于@Jonathan的解决方案:

exec sp_MSforeachdb 'SELECT "?" AS DB, * FROM [?].sys.tables WHERE name like ''%YourTableName%''' 

答案 6 :(得分:-2)

exec 'select ''?'', name from [?].sys.tables where name = ''yourTable'''