2011-01-19 22 views
12

Tengo un servidor SQL con cientos de bases de datos y cada base de datos tiene cientos de tablas. Ahora me gustaría encontrar dónde en estas bases de datos hay una tabla que estoy buscando.Encontrar una base de datos con una tabla particular O Buscar una tabla en cada base de datos de SQL Server

que podría encontrar si una tabla existente en la base de datos individual usando

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

pero usando esto significa que tengo que cambiar manualmente la base de datos de cientos de veces. Me gustaría encontrar el nombre de la base de datos solamente. ¿Hay una salida?

+0

posible duplicado de [ayuda consulta sp_MSforeachdb] (http://stackoverflow.com/questions/3837673/sp-msforeachdb-query-help) –

+1

@Damien_The_Unbeliever: El procedimiento almacenado mismo sistema se puede utilizar en la solución de pero la pregunta no es la misma en mi opinión. –

+0

@John Sansom: el título de la otra pregunta está mal redactado, pero se trata de encontrar y trabajar con una tabla en cada base de datos en un servidor, donde hay otras bases de datos en el servidor que no tendrán esta tabla. Pensé que estaba lo suficientemente cerca. –

Respuesta

15

bien, si sólo está queriendo encontrar cada base de datos que contenga una tabla particular, y que no vayan a consultar la tabla, entonces pueden hacer:

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 

(Si no está utilizando varios esquemas de bases de datos, no será necesario especificar dbo en la llamada OBJECT_ID, de lo contrario lo uso para evitar la búsqueda de tablas en el esquema equivocado)

+1

[Es posible hacer esto sin las tablas #temp y sp_msforeachdb] (http: // stackoverflow.com/questions/4733170/find-a-database-with-a-particular-table-or-find-a-table-in-every-database-of-sql/5365215 # 5365215) –

+0

@Martin - TBH, creo Me acaba de volver a plantear otra respuesta que estaba consultando la tabla en cada base de datos. –

14

Esto debería hacer lo que busca:

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

para incluir el nombre de la base de datos actual en el uso de salida:

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

Se ejecutó el sql, pero no pude obtener el nombre de la base de datos. – Thunder

+0

@Thunder por lo que desea que el nombre de la base de datos se muestre en el conjunto de resultados también? –

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

Sé que este es un hilo viejo, pero fue alto en mi búsqueda en Google. Así que quise contribuir para otros que buscan encontrar una base de datos con cierta tabla. Estos se aplican a SQL Server 2008 - Actual.

Comencé con esto, que funcionó para mi inicio de sesión de nivel SA, pero me dio problemas con los usuarios que no tenían permisos para todas las bases de datos.

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

pero terminó con esta adición de la HAS_DBACCESS(name) = 1 en la restricción de modo que la consulta no fallaría con un error de seguridad.

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

Para tablas en el esquema predeterminado/conocido, ¡esto es genial! –

Cuestiones relacionadas