2009-03-04 4 views
9

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

Я использую MS Sql Server Management Студия 2008.

ответ

13

Грубые и грязные, но это сработает.

-- 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' 
+1

+1 для использования sp_MSforeachdb, о котором я не знал. – cdonner

+0

Это когда вы узнаете, что поддержка двухлетней поддержки SQL Server может быть полезна :) – 2009-03-04 14:02:17

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

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

1
EXEC sp_MSForEachDB ' 
USE ? 
IF OBJECT_ID(''mytable'') IS NOT NULL AND 
    OBJECTPROPERTY(OBJECT_ID(''mytable''), ''IsTable'') = 1 
    PRINT ''?'' 
' 
2

Minor осветление только, чтобы избежать головной боли для тех, кто 'суперпользователя', которые не знают, как назвать DBS:

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

, поэтому вы избежали имени базы данных. хороший звонок –

5

Один из способов

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 
+0

Отличная идея, спасибо. Обобщёл его в виде и сохранил, только то, что мне было нужно! – eftpotrm

+0

@eftpotrm - А у меня есть лучший способ, чем сейчас. [Вот ссылка] (http://stackoverflow.com/a/16520904/73226) –

+0

Спасибо. У меня появилось несколько другое требование, так что я не думаю, что это не работает. Жаль :-) Добавление моего в качестве ответа в месяц. – eftpotrm

3

Основе ответ Мартина Смита выше, но обобщаются в целях дать своего рода кросс-DB версии 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) 

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

EDIT - Игнорируйте это, обнаружив, что он иногда пропускает таблицы вообще.

Смежные вопросы