2013-08-09 16 views
11

Ho molti database nel mio SQL Server.Visualizza tutti i nomi dei database contenenti la tabella specifica

devo cercare solo per i nomi dei database containg particolare nome della tabella Heartbitmaster

Ho molte basi di dati come ad esempio Gotgold, DVD, ecc e voglio solo trovare i nomi di database di query che contengono questa tabella Heartbitmaster.

ho cercato ho provato per la query:

SELECT 
    TABLE_NAME 
FROM 
    INFORMATION_SCHEMA.TABLES 
WHERE 
    TABLE_TYPE = 'base table' 
    AND table_schema = 'Heartbitmaster' 

ma non ha funzionato.

Ho cercato più e mi sono imbattuto:

SELECT name, database_id, create_date 
FROM sys.databases 

ma non so come organizzare ulteriormente in cui condizione per la ricerca del nome della tabella

Ti prego, aiutami.

risposta

24

ho preso fatto attraverso seguente query:

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

Ovviamente, questo non troverà alcuna tabella chiamata 'heartbit' che si trova in uno schema diverso da' dbo'. –

+1

DESIDERO TROVARE Db NAME CONTAINIING TABLE HEARTBIT –

+3

non c'è bisogno di gridare - stavo solo indicando una limitazione. La query potrebbe funzionare nelle tue circostanze, ma potrebbe non essere adatta ai futuri visitatori di questa domanda. –

1

Se hai bisogno di trovare oggetti di database (ad esempio tabelle, colonne, trigger) per nome - uno sguardo alla funzione LIBERO Red-Gate chiamato SQL Search che fa questo - si cerca il vostro intero database per ogni tipo di corda (S).

enter image description here

enter image description here

E 'un grande strumento indispensabile per qualsiasi DBA o database di sviluppatore - l'ho già detto che è assolutamente GRATUITO da utilizzare per qualsiasi tipo di utilizzo ??

Come per il INFORMATION_SCHEMA o le viste del catalogo specifiche di SQL Server: per quanto ne so, sono sempre vincolati al database corrente in cui ci si trova, quindi non è possibile eseguire ricerche in tutti i database sul server. La ricerca SQL fa questo per te, cercando in ogni singolo database sul server.

+0

mi è stato chiesto di fare la query –

+0

vedere la mia modifica –

+0

@NavatKayAahe: come ho detto - non credo che tu possa farlo in una sola query. Sì, è possibile ottenere un elenco di database da 'sys.databases', ma in tal caso è necessario eseguire iterazioni su questo elenco, andare su ciascun database separatamente e ispezionare la sua vista del catalogo' (database) .sys.tables'. –

1

CREATE PROCEDURE come muggito

CREATE PROCEDURE usp_FindTableNameInAllDatabase 
@TableName VARCHAR(256) 
AS 
DECLARE @DBName VARCHAR(256) 
DECLARE @varSQL VARCHAR(512) 
DECLARE @getDBName CURSOR 
SET @getDBName = CURSOR FOR 
SELECT name 
FROM sys.databases 
CREATE TABLE #TmpTable (DBName VARCHAR(256), 
SchemaName VARCHAR(256), 
TableName VARCHAR(256)) 
OPEN @getDBName 
FETCH NEXT 
FROM @getDBName INTO @DBName 
WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @varSQL = 'USE ' + @DBName + '; 
INSERT INTO #TmpTable 
SELECT '''+ @DBName + ''' AS DBName, 
SCHEMA_NAME(schema_id) AS SchemaName, 
name AS TableName 
FROM sys.tables 
WHERE name LIKE ''%' + @TableName + '%''' 
EXEC (@varSQL) 
FETCH NEXT 
FROM @getDBName INTO @DBName 
END 
CLOSE @getDBName 
DEALLOCATE @getDBName 
SELECT * 
FROM #TmpTable 
DROP TABLE #TmpTable 
GO 
EXEC usp_FindTableNameInAllDatabase 'Address' 
GO 

exec usp_FindTableNameInAllDatabase 'user' 
+0

grazie per la risposta, ma sopra la semplice query che ho pubblicato come risposta ha funzionato. –

2

avevo bisogno di qualcosa di leggermente diverso.

Ciò restituirà tutte le tabelle ed i loro DB corrispondenti con i nomi che contengono la stringa fornita:

SELECT TABLE_NAME, TABLE_SCHEMA 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME like '%_<insert_name_here>'; 
+0

Il tuo scenario è una situazione in cui gli sviluppatori si trovano spesso ma non sono realmente correlati all'obiettivo dell'OP. ** Per chi legge questo, se non è chiaro, trova 'tables', non' databases' che corrispondono ai criteri. ** –

+0

Aspetta, non chiedere OP: "Ho molti database [...] e io voglio solo trovare i nomi dei database dalla query che contengono questa tabella Heartbitmaster. "? Il modo in cui l'ho capito, OP sta cercando di trovare i DB che contengono tabelle con il nome 'Heartbitmaster' – laus102

+0

Destra in modo che la soluzione che ha desiderato e trovato lo abbia fatto. Ha trovato i database * che contenevano * le tabelle. La tua soluzione trova solo tabelle all'interno di un database, se questo ha senso. –

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

provare questo

Problemi correlati