2011-01-19 20 views
12

Mam serwer SQL z setkami baz danych i każdą bazą danych zawierającą setki tabel. Teraz chciałbym dowiedzieć się, gdzie w tych bazach danych znajduje się tabela, której szukam.Znajdź bazę danych z konkretną tabelą LUB Znajdź tabelę w każdej bazie danych SQL Server

mogę znaleźć, jeśli istnieje tabela w bazie danych przy użyciu indywidualnego

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

ale stosując oznacza to muszę ręcznie zmienić bazę danych do setki razy. Chciałbym znaleźć tylko nazwę bazy danych. Czy istnieje wyjście?

+0

możliwe duplikat [sp_MSforeachdb zapytania pomocą] (http://stackoverflow.com/questions/3837673/sp-msforeachdb-query-help) –

+1

@Damien_The_Unbeliever: Taki sam układ procedury przechowywanej może być stosowany w roztworze ale moim zdaniem pytanie nie jest takie samo. –

+0

@John Sansom - tytuł drugiego pytania jest źle sformułowany, ale dotyczy znalezienia i pracy z tabelą w każdej bazie danych na serwerze, na której znajdują się inne bazy danych na serwerze, które nie będą miały tej tabeli. Myślałem, że jest wystarczająco blisko. –

Odpowiedz

15

Dobrze, jeśli jesteś po prostu chcąc znaleźć każdą bazę danych, która zawiera konkretną tabelę, i nie będzie zapytań o tabelę, możesz po prostu wykonać:

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 

(Jeśli nie używasz wielu schematów w swoich bazach danych, nie trzeba będzie określić dbo w zaproszeniu OBJECT_ID, inaczej go używać, aby uniknąć znalezienia tabele w niewłaściwym schematu)

+1

[Można to zrobić bez tabliC#temp i sp_msforeachdb] (http: // stackoverflow.com/questions/4733170/find-a-database-with-a-specific-table-or-find-a-table-in-every-database-of-sql/5365215 # 5365215) –

+0

@Martin - TBH, myślę Właśnie przeredagowałem kolejną odpowiedź, która sprawdzała tabelę w każdej bazie danych. –

14

ten powinien zrobić to, czego szukasz:

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

Aby zawierać nazwę bieżącej bazy danych w użytku wyjściowych:

EXEC sp_MSforeachdb "use [?];select '[?]' as DatabaseName, * from sys.tables where name='TableName' " 
+0

Wykonano sql, ale nie mogłem pobrać nazwy bazy danych. – Thunder

+0

@Thunder, więc chcesz, aby nazwa bazy danych również była wyprowadzana w zestawie wyników? –

1
exec sp_msforeachdb @command1='  
USE ?; 
select * from sys.tables where name = ''CLIENTS'''  
-2
exec 'select ''?'', name from [?].sys.tables where name = ''yourTable''' 
6
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' 
2

Wiem, że jest to stary wątek, ale był wysoki w mojej wyszukiwarce Google. Dlatego chciałem przyczynić się do tego, aby inni szukali bazy danych z pewną tabelą. Mają one zastosowanie do SQL Server 2008 - Current.

Zacząłem od tego, co zadziałało dla mojego loginu poziomu SA, ale dało mi problemy z użytkownikami, którzy nie mieli uprawnień do wszystkich baz danych.

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

Ale skończyło się to dodając HAS_DBACCESS(name) = 1 w ograniczeniu tak, że zapytanie nie powiedzie się z błędu zabezpieczeń.

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

Dla tabel w domyślnym/znanym schemacie jest to świetne! –

Powiązane problemy