Jak mogę wybrać dane w tym samym zapytaniu z dwóch różnych baz danych, które znajdują się na dwóch różnych serwerach w SQL Server?
Jak mogę wybrać dane w tym samym zapytaniu z dwóch różnych baz danych, które znajdują się na dwóch różnych serwerach w SQL Server?
Odpowiedzi:
To, czego szukasz, to połączone serwery. Możesz się do nich dostać w SSMS z następującej lokalizacji w drzewie Eksploratora obiektów:
Server Objects-->Linked Servers
lub możesz użyć sp_addlinkedserver .
Musisz tylko skonfigurować jeden. Gdy to zrobisz, możesz wywołać tabelę na innym serwerze w następujący sposób:
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
Pamiętaj, że właściciel nie zawsze jest dbo
taki, więc pamiętaj, aby zastąpić go dowolnym używanym schematem.
[OtherServerName].[OtherDB]..[OtherTable]
. Najlepiej jednak dołączyć, jeśli jest znany.
Możesz to zrobić za pomocą Połączonego serwera.
Zwykle połączone serwery są skonfigurowane tak, aby umożliwić aparatowi bazy danych wykonanie instrukcji Transact-SQL, która zawiera tabele w innej instancji SQL Server lub innym produkcie bazodanowym, takim jak Oracle. Wiele typów źródeł danych OLE DB można skonfigurować jako połączone serwery, w tym Microsoft Access i Excel.
Połączone serwery oferują następujące zalety:
Przeczytaj więcej o połączonych serwerach .
Obiekty serwera -> Połączone serwery -> Nowy połączony serwer
Podaj nazwę zdalnego serwera.
Wybierz typ zdalnego serwera (SQL Server lub inny).
Wybierz Bezpieczeństwo -> Wykonaj przy użyciu tego kontekstu bezpieczeństwa i podaj login i hasło do zdalnego serwera.
Kliknij OK i gotowe!
Oto prosty samouczek dotyczący tworzenia połączonego serwera.
LUB
Możesz dodać połączony serwer za pomocą zapytania.
Składnia:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
Przeczytaj więcej o sp_addlinkedserver .
Połączony serwer musisz utworzyć tylko raz . Po utworzeniu połączonego serwera możemy wykonać kwerendę w następujący sposób:
select * from LinkedServerName.DatabaseName.OwnerName.TableName
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
Możesz także spojrzeć na korzystanie z połączonych serwerów. Połączone serwery mogą być również innego rodzaju źródłami danych, takimi jak platformy DB2. Jest to jedna metoda próby uzyskania dostępu do bazy danych DB2 z wywołania SQL Server TSQL lub Sproc ...
Could not find server '88.208.229.164' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.
Zapytanie w 2 różnych bazach danych jest zapytaniem rozproszonym. Oto lista niektórych technik oraz plusy i minusy:
Spróbuj tego:
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=YOUR SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
UNION
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=ANOTHER SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
To są dobre odpowiedzi, ale tej brakuje i ma ona swoje potężne zastosowania. Być może nie pasuje do tego, czego chciał PO, ale pytanie było niejasne i czuję, że inni mogą tu znaleźć drogę. Zasadniczo możesz użyć 1 okna do jednoczesnego uruchomienia zapytania do wielu serwerów, oto jak:
W SSMS otwórz Zarejestrowane serwery i utwórz nową grupę serwerów w Lokalne grupy serwerów .
W ramach tej grupy utwórz rejestrację nowego serwera dla każdego serwera, do którego chcesz wysłać zapytanie. Jeśli nazwy DB są różne, ustaw wartość domyślną dla każdej właściwości.
Teraz wróć do grupy utworzonej w pierwszym kroku, kliknij prawym przyciskiem myszy i wybierz Nowe zapytanie. Otworzy się nowe okno zapytania, a każde uruchomione zapytanie zostanie wykonane na każdym serwerze w grupie. Wyniki są prezentowane w jednym zestawie danych z dodatkową nazwą kolumny wskazującą, z którego serwera pochodzi rekord. Jeśli użyjesz paska stanu, zauważysz, że nazwa serwera została zastąpiona wielokrotnością .
Miałem ten sam problem z połączeniem SQL_server 2008 z SQL_server 2016 hostowanym na zdalnym serwerze. Inne odpowiedzi nie były dla mnie proste. Piszę tutaj moje poprawione rozwiązanie, ponieważ myślę, że może być przydatne dla kogoś innego.
Rozszerzona odpowiedź dla zdalnych połączeń IP db:
Krok 1: połącz serwery
EXEC sp_addlinkedserver @server='SRV_NAME',
@srvproduct=N'',
@provider=N'SQLNCLI',
@datasrc=N'aaa.bbb.ccc.ddd';
EXEC sp_addlinkedsrvlogin 'SRV_NAME', 'false', NULL, 'your_remote_db_login_user', 'your_remote_db_login_password'
...gdzie SRV_NAME
jest wymyślona nazwa. Użyjemy go, aby odnieść się do zdalnego serwera z naszych zapytań. aaa.bbb.ccc.ddd
to adres IP zdalnego serwera hostującego twoją bazę danych SQLserver.
Krok 2: Uruchom swoje zapytania Na przykład:
SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table
...i to wszystko!
Szczegóły składni: sp_addlinkedserver i sp_addlinkedsrvlogin
Utworzono definicję serwera połączonego na jednym serwerze do drugiego (musisz to zrobić SA), a następnie po prostu odnieś się do nich za pomocą 4-częściowej nazwy (patrz BOL).
Serwer 2008:
Będąc w SSMS podłączonym do server1.DB1 i spróbuj:
SELECT * FROM
[server2].[DB2].[dbo].[table1]
jak zauważyli inni, jeśli to nie działa, to dlatego, że serwer nie jest połączony.
Dostaję błąd:
Nie można znaleźć serwera DB2 w sys.servers. Sprawdź, czy podano prawidłową nazwę serwera. Jeśli to konieczne, wykonaj procedurę przechowywaną sp_addlinkedserver, aby dodać serwer do sys.servers.
Aby dodać serwer:
odniesienie: Aby dodać serwer za pomocą sp_addlinkedserver Link: [1]: Aby dodać serwer za pomocą sp_addlinkedserver
Aby zobaczyć, co jest w twoim sys.servers, po prostu zapytaj:
SELECT * FROM [sys].[servers]
Jak @ Super9 powiedział o OPENDATASOURCE przy użyciu uwierzytelniania SQL Server z dostawcą danych SQLOLEDB . Właśnie zamieszczam tutaj fragment kodu dla jednej tabeli w bieżącej bazie danych serwera, w której działa kod, a drugiej na innym serwerze „192.166.41.123”
SELECT top 2 * from dbo.tblHamdoonSoft tbl1 inner JOIN
OpenDataSource('SQLOLEDB','Data Source=192.166.41.123;User ID=sa;Password=hamdoonsoft')
.[TestDatabase].[dbo].[tblHamdoonSoft1] tbl2 on tbl1.id = tbl2.id
Wiem, że to stare pytanie, ale używam synonimów. Podobno zapytanie jest wykonywane na serwerze bazy danych A i szuka tabeli na serwerze bazy danych B, który nie istnieje na serwerze A. Dodaj następnie synonim w bazie danych, która wywołuje twoją tabelę z serwera B. Twoje zapytanie nie musi dołącz dowolne schematy lub różne nazwy baz danych, wystarczy wywołać nazwę tabeli jak zwykle i zadziała.
Nie ma potrzeby łączenia serwerów, ponieważ synonimy na powiedzmy są rodzajem łączenia.
Obiekty serwera ---> serwer połączony ---> nowy serwer połączony
Na połączonym serwerze napisz nazwę serwera lub adres IP dla innego serwera i wybierz SQL Server W zabezpieczeniach wybierz (wybierz przy użyciu tego kontekstu bezpieczeństwa) Wpisz login i hasło dla innego serwera
Teraz podłączony, a następnie użyj
Select * from [server name or ip addresses ].databasename.dbo.tblname
Uproszczone rozwiązanie do dodawania połączonych serwerów
Pierwszy serwer
EXEC sp_addlinkedserver @server='ip,port\instancename'
Drugie logowanie
EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'
Wykonuj zapytania z łącza do lokalnej bazy danych
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]