显示包含特定表的所有数据库名称

问题描述 投票:0回答:8

我的 SQL Server 中有很多数据库。

我必须搜索包含特定表名称的数据库名称

Heartbitmaster

我有很多数据库,例如

Gotgold
DVD
等,我只想从包含此表的查询中查找数据库名称
Heartbitmaster

我搜索了我尝试查询的内容:

SELECT 
    TABLE_NAME  
FROM 
    INFORMATION_SCHEMA.TABLES 
WHERE 
    TABLE_TYPE = 'base table'   
    AND table_schema = 'Heartbitmaster'

但是没有成功。

我进一步搜索并发现:

SELECT name, database_id, create_date
FROM sys.databases 

但不知道如何进一步安排表名搜索的where条件

请帮助我。

sql sql-server database sql-server-2008
8个回答
60
投票

我通过以下查询完成了它:

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

21
投票
sp_MSforeachdb 'SELECT "?" AS DB, * FROM [?].sys.tables WHERE name like ''%tablename%'''

试试这个


5
投票

我需要一些稍微不同的东西。

这将返回名称包含提供的字符串的所有表及其相应的数据库:

SELECT TABLE_NAME, TABLE_SCHEMA 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME like '%_<insert_name_here>';

2
投票

如果您需要按名称查找数据库对象(例如表、列、触发器) - 请查看称为 SQL Search免费 Red-Gate 工具,它可以执行此操作 - 它会在整个数据库中搜索任何类型的字符串(s).

enter image description here

enter image description here

对于任何 DBA 或数据库开发人员来说,它都是一个很棒的必备工具 - 我是否已经提到过它绝对免费可用于任何类型的用途?

至于

INFORMATION_SCHEMA
或 SQL Server 特定目录视图:据我所知,这些视图始终仅限于您所在的当前数据库 - 因此您无法搜索服务器上的所有数据库。 SQL 搜索为您完成此操作 - 通过搜索服务器上的每个数据库。


1
投票

创建程序如下

CREATE PROCEDURE usp_FindTableNameInAllDatabase
@TableName VARCHAR(256)
AS
DECLARE @DBName VARCHAR(256)
DECLARE @varSQL VARCHAR(512)
DECLARE @getDBName CURSOR
SET @getDBName = CURSOR FOR
SELECT name
FROM sys.databases
CREATE TABLE #TmpTable (DBName VARCHAR(256),
SchemaName VARCHAR(256),
TableName VARCHAR(256))
OPEN @getDBName
FETCH NEXT
FROM @getDBName INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @varSQL = 'USE ' + @DBName + ';
INSERT INTO #TmpTable
SELECT '''+ @DBName + ''' AS DBName,
SCHEMA_NAME(schema_id) AS SchemaName,
name AS TableName
FROM sys.tables
WHERE name LIKE ''%' + @TableName + '%'''
EXEC (@varSQL)
FETCH NEXT
FROM @getDBName INTO @DBName
END
CLOSE @getDBName
DEALLOCATE @getDBName
SELECT *
FROM #TmpTable
DROP TABLE #TmpTable
GO
EXEC usp_FindTableNameInAllDatabase 'Address'
GO 

exec usp_FindTableNameInAllDatabase 'user'

0
投票

它有效!!!!!!!
运行此查询以查找特定表的数据库名称 @tablename中粘贴表名

删除表#tempo以供下次运行

declare @tablename varchar(max) = 'patient'
declare @count int = (select max(database_id) FROM   sys.databases)
declare @n int = 1
declare @dbname varchar(max)
declare @query nvarchar(max)
create table #tempo(Databasename varchar(max), tablename varchar(max))
while @n <= @count
begin
select @dbname = name from sys.databases where database_id = @n and service_broker_guid <> '00000000-0000-0000-0000-000000000000'
set @query = 'insert into #tempo(Databasename,tablename) select '''+@dbname+''' [Database],name from '+@dbname+'.sys.tables where name like ''%'+@tablename+'%'''
exec(@query)
set @n=@n+1;
end
select * from #tempo

最后出现类似

的错误

数据库“databasename”无法打开,因为它处于脱机状态。

然后单独运行此查询

select * from #tempo

0
投票

我完成 sp_MSforeachdb 并创建一个像这样的过程:

create PROCEDURE findTableName
@tablename nvarchar(max) 
AS
BEGIN
    declare @sqlCommand nvarchar(max) 
    CREATE TABLE #t (DBName VARCHAR(256),SchemaName VARCHAR(256),TableName VARCHAR(256))
    set @sqlCommand='insert into #t (DBName,SchemaName,TableName) exec sp_MSforeachdb ''SELECT "?" AS DB, SCHEMA_NAME(schema_id) AS SchemaName ,name FROM [?].sys.tables WHERE name like ''''%'+@tablename+'%'''''''
    --print @sqlCommand
    exec ( @sqlCommand)
    select * from #t
END

0
投票

这是给您的脚本...

如果 OBJECT_ID('tempdb..#tbls') 不为空 删除表#tbls 创建表 #tbls([DB] sysname, [name] sysname, [object_id] int, [principal_id] int, [schema_id] int, [parent_object_id] int, [type] char(2), [type_desc] nvarchar(60)、[create_date] 日期时间、[modify_date] 日期时间、[is_ms_shipped] 位、[is_published] 位、[is_schema_published] 位、 [lob_data_space_id] int,[filestream_data_space_id] int,[max_column_id_used] int, [lock_on_bulk_load] 位、[uses_ansi_nulls] 位、[is_replicated] 位、[has_replication_filter] 位、[is_merge_published] 位、[is_sync_tran_sbscribed] 位、 [has_unchecked_ assembly_data] 位、[text_in_row_limit] int、[large_value_types_out_of_row] 位、[is_tracked_by_cdc] 位、[lock_escalation] tinyint、 [lock_escalation_desc] nvarchar(60)、[is_filetable] 位、[is_memory_optimized] 位、[durability] tinyint、[durability_desc] nvarchar(60)、 [temporal_type] tinyint、[temporal_type_desc] nvarchar(60)、[history_table_id] int、[is_remote_data_archive_enabled] 位、[is_external] 位)

EXEC sp_MSforeachdb 'INSERT INTO #tbls SELECT "?" AS DB, * FROM [?].sys.tables WHERE name like ''%INSERT TABLE NAME HERE%'''; 从#tbls中选择*

© www.soinside.com 2019 - 2024. All rights reserved.