2011-07-04 4 views
12

Tôi đang cố gắng tạo một tập lệnh SQL nhỏ (trong SQL Server Management Studio) để có danh sách tất cả các bảng trong hai cơ sở dữ liệu khác nhau. Mục đích là để tìm ra bảng nào tồn tại trong cả hai cơ sở dữ liệu và những bảng nào chỉ tồn tại trong một trong số chúng.Cách lấy danh sách tất cả các bảng trong hai cơ sở dữ liệu khác nhau

Tôi đã tìm thấy các tập lệnh khác nhau trên SO để liệt kê tất cả các bảng của một cơ sở dữ liệu, nhưng cho đến nay tôi không thể có danh sách các bảng nhiều cơ sở dữ liệu.

Vì vậy: có cách nào để truy vấn SQL Server cho tất cả các bảng trong cơ sở dữ liệu cụ thể hay không, ví dụ: SELECT * FROM ... WHERE databaseName='first_db' để tôi có thể tham gia kết quả này với một cơ sở dữ liệu khác?

Trả lời

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

CẬP NHẬT

Để so sánh hai danh sách, bạn có thể sử dụng FULL OUTER JOIN, mà sẽ hiển thị cho bạn các bảng hiện diện trong cả hai cơ sở dữ liệu cũng như những bảng chỉ hiện diện trong một trong số chúng:

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) 

Bạn cũng có thể thêm WHERE db1.TABLE_NAME IS NULL OR db2.TABLE_NAME IS NULL để chỉ xem sự khác biệt giữa các cơ sở dữ liệu.

+0

+1 Thật tuyệt, tôi có thể thề rằng điều này không hiệu quả! Thậm chí làm việc với SQL Server cụ thể 'db1.sys.tables'. – Andomar

2

Theo như tôi biết, bạn chỉ có thể truy vấn bảng cho cơ sở dữ liệu đang hoạt động. Nhưng bạn có thể lưu trữ chúng trong một bảng tạm thời, và tham gia vào kết quả:

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

Chỉ cần cho đầy đủ, đây là câu hỏi cuối cùng tôi đã sử dụng (dựa trên câu trả lời 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 

Để tìm ra bảng tồn tại trong DB2, nhưng không phải trong db1, thay thế các LEFT OUTER JOIN với một RIGHT OUTER JOIN .

+0

Có, và để tìm ra cả hai, bạn có thể sử dụng 'FULL OUTER JOIN' để thay thế. –