2015-05-17 18 views
5

Mam wspólną tabelę "Aktywność użytkownika" w około 200 różnych bazach danych na różnych serwerach, czy można wybrać wiersze ze wszystkich baz danych dla tej tabeli w jednej instrukcji?Zapytanie Różne bazy danych - Ta sama tabela SQL Server 2012

Mam listę tych baz danych i serwerów są one na ina głównej bazy danych/tabeli, można uzyskać przez Wybierz ServerName, dbname z DBases z CustomersList

Odpowiedz

5

tak, ale trzeba wyraźnie wspomnieć je wszystkie:

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 

Jest to coś, co po prostu zbudowałem w Excelu i wkleiłem w SSMS.

Następnie należy zastanowić się, czy to dobry projekt, aby mieć to w 200 bazach danych.

+0

Dzięki. Czy istnieje bardziej elegancki sposób? Mam listę bazy danych na jednym głównym stole/bazie danych. – Bill

+0

Zależy od tego, co masz na myśli, mówiąc elegancko. Czy rozwiązanie @ shA.t jest bardziej eleganckie? Nie sądzę, ale możesz! –

1

Proponuję, aby korzystać z tej składni:

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) 

można łatwo zoptymalizować go do wykorzystania w procedurze przechowywanej.

0

ja dostaję ten błąd:

Niepoprawna składnia w pobliżu 'ALL'

Podczas próby uruchomienia kodu.

Mam tablicę adresów w dwóch bazach więc modyfikować swój kod jako:

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)