я думаю, что вы хотите написать это sp_MSforeachdb 'SELECT "?" AS DB, * FROM [?]. Sys.tables ГДЕ имя, например, ''% yourtable ame% '' '

я есть SQL Server с сотнями баз данных, и каждая база данных имеет сотни таблиц. Теперь я хотел бы найти, где в этих базах данных находится таблица, которую я ищу.

Я мог бы найти, если таблица существует в отдельной базе данных, используя

use myDatabase 
select * from sys.tables  where name = 'mytable' 
GO

но, используя это, я должен вручную менять базу данных сотни раз. Я хотел бы найти только имя базы данных. Есть ли выход?

 Damien_The_Unbeliever19 янв. 2011 г., 09:36
возможный дубликатСправка по запросу sp_MSforeachdb
 Damien_The_Unbeliever19 янв. 2011 г., 10:14
извини, я явно слишком много читаю на твой вопрос Обычно я нахожу, что это первая часть более длинного вопроса «... и, найдя базы данных, содержащие эту таблицу, как мне выполнить запрос к этой таблице в каждой базе данных».
 John Sansom19 янв. 2011 г., 09:48
@Damien_The_Unbeliever: в решении может использоваться та же системная хранимая процедура, но, на мой взгляд, вопрос не тот же.
 Thunder19 янв. 2011 г., 10:03
@Damien_The_Unbeliever Этот вопрос интересует поиск базы данных с заданной таблицей, поэтому я думаю, что она существенно отличается.
 Damien_The_Unbeliever19 янв. 2011 г., 09:54
@John Sansom - заголовок другого вопроса сформулирован плохо, но он касается поиска и работы с таблицей в каждой базе данных на сервере, где на сервере есть другие БД, у которых не будет этой таблицы. Я думал, что это было достаточно близко.

Ответы на вопрос(7)

Это должно сделать то, что вы ищете:

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

Чтобы включить имя текущей базы данных в вывод, используйте:

EXEC sp_MSforeachdb "use [?];select '[?]' as DatabaseName, * from sys.tables where name='TableName' "
 Thunder19 янв. 2011 г., 09:52
Sql выполнил, но я не мог получить имя базы данных из него.
 John Sansom19 янв. 2011 г., 10:09
@ Thunder, поэтому вы хотите, чтобы имя базы данных также выводилось в наборе результатов?
Решение Вопроса

если вы просто хотите найти каждую базу данных, которая содержит определенную таблицу, и не собираетесь запрашивать таблицу, тогда вы можете просто сделать:

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

(Если вы не используете несколько схем в ваших базах данных, вам не нужно указывать dbo вOBJECT_ID вызов, иначе я использую его, чтобы избежать поиска таблиц в неправильной схеме)

 Damien_The_Unbeliever20 мар. 2011 г., 06:44
@Martin - Т.Б.Х., я думаю, я бы просто переосмыслил другой ответ, который запрашивал таблицу в каждой базе данных.
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'
exec sp_msforeachdb @command1='     
USE ?;
select * from sys.tables where name = ''CLIENTS'''    

что это старая ветка, но в моем поиске Google было много. Поэтому я хотел помочь другим, желающим найти базу данных с определенной таблицей в ней. Это относится к SQL Server 2008 - текущий.

Я начал с этого, который работал для моей учетной записи уровня 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;
 Andrew Hanlon04 авг. 2015 г., 15:49
Для таблиц в схеме по умолчанию / известных это отлично!
exec 'select ''?'', name from [?].sys.tables where name = ''yourTable'''
 nzrytmn05 сент. 2018 г., 10:48
я думаю, что вы хотите написать это sp_MSforeachdb 'SELECT "?" AS DB, * FROM [?]. Sys.tables ГДЕ имя, например, ''% yourtable ame% '' '

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

Ваш ответ на вопрос