2011-07-04 13 views
12

Estoy tratando de crear un pequeño script SQL (en SQL Server Management Studio) para obtener una lista de todas las tablas en dos bases de datos diferentes. El objetivo es averiguar qué tablas existen en ambas bases de datos y cuáles solo existen en una de ellas.Cómo obtener una lista de todas las tablas en dos bases de datos diferentes

He encontrado varias secuencias de comandos en SO para enumerar todas las tablas de una base de datos, pero hasta ahora no he podido obtener una lista de tablas de varias bases de datos.

Entonces, ¿hay alguna manera de consultar SQL Server para todas las tablas en una base de datos específica, p. SELECT * FROM ... WHERE databaseName='first_db' para que pueda unirme a esto con el resultado de otra base de datos?

Respuesta

18
SELECT * FROM database1.INFORMATION_SCHEMA.TABLES 
UNION ALL 
SELECT * FROM database2.INFORMATION_SCHEMA.TABLES 

ACTUALIZACIÓN

el fin de comparar las dos listas, puede utilizar FULL OUTER JOIN, que se le mostrará las tablas que están presentes en ambas bases de datos, así como aquellas que solo están presentes en una de ellas:

SELECT * 
FROM database1.INFORMATION_SCHEMA.TABLES db1 
    FULL JOIN database2.INFORMATION_SCHEMA.TABLES db2 
    ON db1.TABLE_NAME = db2.TABLE_NAME 
ORDER BY COALESCE(db1.TABLE_NAME, db2.TABLE_NAME) 

También puede agregar WHERE db1.TABLE_NAME IS NULL OR db2.TABLE_NAME IS NULL para ver solo las diferencias entre las bases de datos.

+0

+1 ¡Genial, podría haber jurado que esto no funcionó! Incluso funciona con SQL Server específico 'db1.sys.tables'. – Andomar

2

Hasta donde yo sé, solo puede consultar tablas para la base de datos activa. Pero se puede almacenar en una tabla temporal, y unirse al resultado:

use db1 
insert #TableList select (...) from sys.tables 
use db2 
insert #TableList2 select (...) from sys.tables 
select * from #TableList tl1 join Tablelist2 tl2 on ... 
1

simplemente para la corrección, esta es la consulta, finalmente, he utilizado (basado en la respuesta de Andriy M):

SELECT * FROM DB1.INFORMATION_SCHEMA.Tables db1 
    LEFT OUTER JOIN DB2.INFORMATION_SCHEMA.Tables db2 
    ON db1.TABLE_NAME = db2.TABLE_NAME 
    ORDER BY db1.TABLE_NAME 

Para saber en qué tablas existen en DB2, pero no en DB1, sustituir el LEFT OUTER JOIN con un RIGHT OUTER JOIN .

+0

Sí, y para averiguar las dos, puede usar 'FULL OUTER JOIN' en su lugar. –

Cuestiones relacionadas