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

Thu*_*der 12 sql sql-server

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

我可以找到一个表是否存在于个人数据库中使用

use myDatabase 
select * from sys.tables  where name = 'mytable' 
GO
Run Code Online (Sandbox Code Playgroud)

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

Dam*_*ver 16

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • [可以在没有 #temp 表和 sp_msforeachdb 的情况下执行此操作](http://stackoverflow.com/questions/4733170/find-a-database-with-a-particular-table-or-find-a-table-in -every-database-of-sql/5365215#5365215) (2认同)

Joh*_*som 14

这应该做你想要的:

EXEC sp_MSforeachdb "use [?];select * from sys.tables where name='TableName' "
Run Code Online (Sandbox Code Playgroud)

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

EXEC sp_MSforeachdb "use [?];select '[?]' as DatabaseName, * from sys.tables where name='TableName' "
Run Code Online (Sandbox Code Playgroud)


Mar*_*ith 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'
Run Code Online (Sandbox Code Playgroud)