2015-05-17 22 views
5

Tôi có một bảng "Hoạt động người dùng" chung trong khoảng 200 cơ sở dữ liệu khác nhau trên các máy chủ khác nhau, có thể chọn các hàng từ tất cả cơ sở dữ liệu cho bảng đó trong một câu lệnh không?Truy vấn trên cơ sở dữ liệu khác nhau - Cùng một bảng SQL Server 2012

tôi có một danh sách những cơ sở dữ liệu và máy chủ họ đang ở trên ina chính cơ sở dữ liệu/bảng, có thể có được bằng cách Chọn servername, dbname từ DBases từ CustomersList

Trả lời

5

Có, nhưng bạn cần phải đề cập đến tất cả chúng một cách rõ ràng:

SELECT COl1,Col2,Col3 FROM Database1.schema.Table1 
UNION ALL 
SELECT COl1,Col2,Col3 FROM Database2.schema.Table1 
UNION ALL 
SELECT COl1,Col2,Col3 FROM Database3.schema.Table1 
UNION ALL 
....... 
... 
SELECT COl1,Col2,Col3 FROM Database200.schema.Table1 

Đây là loại điều tôi sẽ xây dựng trong Excel và dán vào SSMS.

Sau đó, bạn có thể muốn xem xét lại xem đó là một thiết kế tốt để có điều này trong 200 cơ sở dữ liệu.

+0

Cảm ơn. Có cách nào thanh lịch hơn không? Tôi có một danh sách các cơ sở dữ liệu trên một bảng/cơ sở dữ liệu chính. – Bill

+0

Phụ thuộc vào ý nghĩa của bạn bằng cách thanh lịch. Là giải pháp @ shA.t thanh lịch hơn? Tôi không nghĩ như vậy nhưng bạn có thể! –

1

tôi đề nghị bạn sử dụng cú pháp sau:

DECLARE @tableName nvarchar(256) = 'Table1' 
DECLARE @sql nvarchar(max) = '' 

SELECT @sql = @sql + 'SELECT * FROM [' + dbs.name + ']..[' + @tableName + '] ' 
        + CASE WHEN @sql <> '' THEN 'UNION ALL ' ELSE '' END 
FROM sys.sysdatabases dbs 
WHERE dbs.name NOT IN ('master', 'tempdb', 'msdb', 'model') 

EXEC(@sql) 

Bạn có thể dễ dàng tối ưu hóa nó để sử dụng trong một thủ tục lưu trữ.

0

Tôi nhận được lỗi này:

cú pháp sai gần 'TẤT CẢ'

Trong khi tôi cố gắng chạy mã của bạn.

Tôi có bảng địa chỉ trong hai cơ sở dữ liệu vì vậy tôi đổi mã của bạn như:

DECLARE @tableName nvarchar(256) = 'dbo.Address' 

DECLARE @sql nvarchar(max) = '' 

SELECT @sql = @sql + 'SELECT * FROM [' + dbs.name + ']..[' + @tableName +  '] ' 
       + CASE WHEN @sql <> '' THEN 'UNION ALL ' ELSE '' END 
FROM sys.sysdatabases dbs where dbs.dbid in (7,8) 

and dbs.name NOT IN ('master', 'tempdb', 'msdb', 'model','SSISall') 

EXEC(@sql) 
Các vấn đề liên quan