27

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

我只需要搜索包含特定表名的数据库名称Heartbitmaster

我有许多数据库,例如GotgoldDVD等,我只想从包含此表的查询中查找数据库名称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 

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

请帮我。

4

6 回答 6

46

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

SELECT name FROM   sys.databases WHERE  CASE
  WHEN state_desc = 'ONLINE' 
  THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[heartbit]', 'U')
   END IS NOT NULL
于 2013-08-09T07:35:30.470 回答
13
sp_MSforeachdb 'SELECT "?" AS DB, * FROM [?].sys.tables WHERE name like ''%tablename%'''

试试这个

于 2017-07-20T11:04:39.283 回答
4

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

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

SELECT TABLE_NAME, TABLE_SCHEMA 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME like '%_<insert_name_here>';
于 2017-03-24T15:20:05.463 回答
2

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

在此处输入图像描述

在此处输入图像描述

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

至于INFORMATION_SCHEMA特定于 SQL Server 的目录视图:据我所知,这些视图始终受限于您所在的当前数据库 - 因此您无法搜索服务器上的所有数据库。SQL Search 会为您做到这一点 - 通过搜索服务器上的每个数据库。

于 2013-08-09T07:03:19.230 回答
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'
于 2013-08-09T07:36:37.867 回答
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
于 2019-08-06T13:07:06.170 回答