Поиск таблицы в нескольких базах данных SQL SERVER 2005

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

Я использую MS SQL Server Management Studio 2008.


person Jader Dias    schedule 04.03.2009    source источник


Ответы (5)


Грубый и грязный, но со своей задачей справится.

-- Instructions. Replace "table_name_here" with actual table name
sp_MSforeachdb 'USE ?
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''[table_name_here]'') AND OBJECTPROPERTY(id, N''IsUserTable'') = 1)
BEGIN
  PRINT ''Found in db ?''
END'
person Community    schedule 04.03.2009
comment
Это когда понимаешь, что два года поддержки SQL Server могут быть полезны :) - person ; 04.03.2009

В одну сторону

SELECT  DISTINCT DB_NAME(database_id) 
FROM [sys].[dm_db_index_operational_stats](NULL,NULL,NULL,NULL)
WHERE OBJECT_NAME(object_id,database_id) = 'table_name'

Или, если вы достаточно уверены, это будет схема dbo в любой базе данных.

SELECT name
FROM   sys.databases
WHERE  CASE
         WHEN state_desc = 'ONLINE' 
              THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[table_name]', 'U')
       END IS NOT NULL 
person Martin Smith    schedule 19.03.2011
comment
Отличная идея, спасибо. Обобщил его в вид и сохранил, как раз то, что мне было нужно! - person eftpotrm; 13.06.2013
comment
@eftpotrm - Ах, теперь у меня есть способ получше. Вот ссылка - person Martin Smith; 13.06.2013
comment
Спасибо - у меня немного другое требование, так что, я думаю, это не совсем сработает для меня. Жаль :-) Добавляю свой ответ через месяц. - person eftpotrm; 13.06.2013

Основанный на ответе Мартина Смита выше, но обобщенном в представлении, чтобы дать своего рода версию sys.tables для разных БД -

CREATE VIEW ListTablesAllDBs

AS

SELECT 
    DB_NAME(database_id) as DBName,
    OBJECT_SCHEMA_NAME(object_id,database_id) as SchemaName,
    OBJECT_NAME(object_id,database_id) as TableName
FROM
    [sys].[dm_db_index_operational_stats](NULL,NULL,NULL,NULL)

Теперь, если бы я только мог найти способ сделать то же самое для столбцов...

РЕДАКТИРОВАТЬ. Игнорируйте это, так как он иногда вообще пропускает таблицы.

person eftpotrm    schedule 12.06.2013

Небольшое уточнение, чтобы избежать головной боли для тех, у кого есть «Суперпользователи», которые не знают, как называть БД:

EXEC sp_MSForEachDB '
USE [?]
IF OBJECT_ID(''mytable'') IS NOT NULL AND
   OBJECTPROPERTY(OBJECT_ID(''mytable''), ''IsTable'') = 1
PRINT ''Found here: ?'''
person CalisNight    schedule 17.03.2011

select 'select * from '+name+'.sys.tables where name=
        ''[yourtable]'';' from sys.databases

Вместо [yourtable] введите имя отсутствующей таблицы и снова запустите результат.

person cdonner    schedule 04.03.2009