2011-01-19 18 views
12

Yüzlerce veritabanına ve her veritabanı yüzlerce tabloya sahip bir SQL Server'a sahibim. Şimdi bu veritabanlarında nerede aradığım bir tablo bulmak istiyorum. Bir tablo Belirli bir tablonun bulunduğu bir veritabanını bulun VEYA SQL Server'ın her veritabanında bir tablo bul

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

kullanarak ancak bu kullanarak bireysel veritabanında var olup olmadığını bulabildiğim

elle yüzlerce kez veritabanını değiştirmek zorunda anlamına gelir. Sadece veritabanı adını bulmak istiyorum. Bir çıkış yolu var mı? Sadece eğer,

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

olası yinelenen (http://stackoverflow.com/questions/3837673/sp-msforeachdb-query-help) –

+1

@Damien_The_Unbeliever: Aynı sistem saklı prosedür solüsyonunda kullanılabilir ama soru benim görüşüme göre aynı değil. –

+0

@John Sansom - diğer sorunun başlığı zayıf bir şekilde ifade edildi, ancak sunucudaki her veritabanında, bu tabloya sahip olmayan diğer DB'lerin bulunduğu bir veritabanında bir tablo bulmak ve bulmakla uğraşıyor. Yeterince yakın olduğunu düşündüm. –

cevap

15

Okay:

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

çıkış kullanımında geçerli veritabanının adını dahil etmek için:

+1

[#temp tabloları ve sp_msforeachdb] (http: // stackoverflow] olmadan bunu yapmak mümkündür.com/questions/4733170/bul-a-veritabanı-ile-belirli-tablo-veya-bul-a-tablo-in-her-veritabanı-sql/5365215 # 5365215) –

+0

@Martin - TBH, bence Her veritabanında tabloyu sorgulayan başka bir yanıtı tekrar ele alacağım. –

14

Bu Aradığınız yapmalı Belirli bir tabloyu içeren her bir veritabanını bulmak ve tabloyu sorgulamayacaksanız, o zaman şunları yapabilirsiniz:

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 

+0

sql yürütüldü, ancak veritabanı adını ondan alamadım. – Thunder

+0

@Thunder böylece sonuç kümesinde veritabanı isminin çıktısını almak ister misiniz? –

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' 
(Eğer veritabanlarında birden çok şema kullanmıyorsanız, aksi takdirde yanlış şemada tablolar bulma önlemek için kullanabilirsiniz, OBJECT_ID çağrısında Dbo belirtmek gerekmez)
2

Bu eski bir iş parçacığı olduğunu biliyorum ama google aramada yüksek oldu. Bu yüzden, içinde belirli bir tablo bulunan bir veritabanını bulmak isteyen başkalarına katkıda bulunmak istedim. Bunlar, SQL Server 2008 - Current için geçerlidir.

Bu özelliği, SA düzeyindeki oturum açma girişimi için işe başladım, ancak tüm veritabanlarına yönelik izinleri olmayan kullanıcılarla ilgili sorunlarımı bana verdi.

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

Ama sorgu bir güvenlik hatası vererek başarısız olmaz ki bu kısıtlama içinde HAS_DBACCESS(name) = 1 ekleyerek ile sona erdi.

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; 
[sp_MSforeachdb sorgu yardım] arasında
+0

Varsayılan/bilinen şemadaki tablolar için bu harika! –

İlgili konular