2009-03-04 6 views
9

Ho esportato una tabella su un server ma non riesco a trovare la tabella. Forse non ho inserito il giusto database di destinazione. Come posso trovare questa tabella se il mio server ha più database, senza aprirne uno ciascuno?Trova una tabella su più database SQL SERVER 2005

Io uso MS Sql Server Management Studio 2008.

risposta

13

Ruvido e sporco, ma farebbe il lavoro.

-- 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 per l'utilizzo di sp_MSforeachdb, che non conoscevo. – cdonner

+0

Questo è il momento in cui si scopre che due anni di supporto SQL Server possono essere utili :) –

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

Invece di [YourTable], digitare il nome della tabella mancante, ed eseguire nuovamente il risultato.

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

chiarimento minore solo per evitare il mal di testa per le persone con 'SuperUser' che non sanno come dare un nome DB:

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

in modo da sfuggire al nome del database. buona telefonata –

5

Un modo

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' 

O se sei ragionevolmente sicuro che sarebbe nello schema dbo in qualsiasi database

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

Ottima idea, grazie. Generalizzato in una vista e salvato, proprio quello di cui avevo bisogno! – eftpotrm

+0

@eftpotrm - Ah ho un modo migliore di questo ora. [Ecco un link] (http://stackoverflow.com/a/16520904/73226) –

+0

Grazie - Ho finito con un requisito leggermente diverso, quindi non è proprio andando a lavorare per me, penso. Peccato :-) Aggiungendo il mio come risposta in un momento. – eftpotrm

3

in base al largo la risposta di Martin Smith sopra, ma generalizzato in una vista per dare una sorta di cross-DB versione di 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) 

Ora, se solo riesco a trovare un modo per farlo lo stesso per le colonne .......

MODIFICA - Ignora questo, a volte capita di perdere le tabelle del tutto.