我有一个包含数百个数据库的SQL Server,每个数据库都有数百个表。 现在我想在这些数据库中找到我正在寻找的表格。
我可以使用
找到个人数据库中是否存在表格use myDatabase
select * from sys.tables where name = 'mytable'
GO
但使用这意味着我必须手动更改数据库数百次。 我想只找到数据库名称。 有出路吗?
答案 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'''