Hoe kan ik gegevens in dezelfde query selecteren uit twee verschillende databases die zich op twee verschillende servers in SQL Server bevinden?
Antwoord 1, autoriteit 100%
Wat u zoekt, zijn gekoppelde servers. U kunt ze in SSMS bereiken vanaf de volgende locatie in de boomstructuur van de Objectverkenner:
Server Objects-->Linked Servers
of u kunt sp_addlinkedservergebruiken.
Je hoeft er maar één in te stellen. Als je dat eenmaal hebt, kun je een tafel op de andere server als volgt bellen:
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
Houd er rekening mee dat de eigenaar niet altijd dbo
is, dus zorg ervoor dat u deze vervangt door het schema dat u gebruikt.
Antwoord 2, autoriteit 28%
Je kunt het doen met Linked Server.
Meestal zijn gekoppelde servers zo geconfigureerd dat de Database Engine een Transact-SQL-instructie kan uitvoeren die tabellen bevat in een ander exemplaar van SQL Server of een ander databaseproduct zoals Oracle. Veel typen OLE DB-gegevensbronnen kunnen worden geconfigureerd als gekoppelde servers, waaronder Microsoft Access en Excel.
Gelinkte servers bieden de volgende voordelen:
- De mogelijkheid om toegang te krijgen tot gegevens van buiten SQL Server.
- De mogelijkheid om gedistribueerde query’s, updates, opdrachten en transacties uit te geven op heterogene gegevensbronnen in de hele onderneming.
- De mogelijkheid om verschillende gegevensbronnen op dezelfde manier aan te pakken.
Lees meer over Gelinkte servers.
Volg deze stappen om een gekoppelde server te maken:
-
Serverobjecten -> Gekoppelde servers -> Nieuwe gekoppelde server
-
Geef de naam van de externe server op.
-
Selecteer het type externe server (SQL-server of anders).
-
Selecteer Beveiliging -> Maak gebruik van deze beveiligingscontext en geef de login en het wachtwoord van de externe server op.
-
Klik op OK en je bent klaar !!
Hieris een eenvoudige tutorial voor het maken van een gekoppelde server.
OF
U kunt een gekoppelde server toevoegen met behulp van query.
Syntaxis:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
Lees meer over sp_addlinkedserver.
U hoeft een gekoppelde server slechts één keerte maken. Nadat we een gekoppelde server hebben gemaakt, kunnen we deze als volgt opvragen:
select * from LinkedServerName.DatabaseName.OwnerName.TableName
Antwoord 3, autoriteit 7%
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
Je kunt ook kijken naar het gebruik van gekoppelde servers. Gekoppelde servers kunnen ook andere typen gegevensbronnen zijn, zoals DB2-platforms. Dit is een methode om toegang te krijgen tot DB2 vanaf een SQL Server TSQL- of Sproc-aanroep…
Antwoord 4, autoriteit 7%
Query in 2 verschillende databases is een gedistribueerde query. Hier is een lijst van enkele technieken plus de voor- en nadelen:
- Gelinkte servers:bieden toegang tot een grotere verscheidenheid aan gegevensbronnen dan SQL Server-replicatie biedt
- Gelinkte servers:maak verbinding met gegevensbronnen die replicatie niet ondersteunt of waarvoor ad-hoctoegang is vereist
- Gelinkte servers:Presteren beter dan OPENDATASOURCE of OPENROWSET
- OPENDATASOURCEen OPENROWSETfuncties:
Handig voor het ad hoc ophalen van data uit databronnen.
OPENROWSET heeft ook BULK-faciliteiten die al dan niet een formaatbestand vereisen dat misschien onhandig is - OPENQUERY: ondersteunt geen variabelen
- Allezijn T-SQL-oplossingen. Relatief eenvoudig te implementeren en in te stellen
- Allezijn afhankelijk van de verbinding tussen bron en bestemming, wat de prestaties en schaalbaarheid kan beïnvloeden
Antwoord 5, autoriteit 5%
Dit zijn allemaal prima antwoorden, maar deze ontbreekt en heeft zijn eigen krachtige toepassingen. Mogelijk past het niet in wat de OP wilde, maar de vraag was vaag en ik heb het gevoel dat anderen hier hun weg kunnen vinden. In principe kunt u 1 venster gebruiken om tegelijkertijd een query op meerdere servers uit te voeren, als volgt:
Open in SSMS Geregistreerde servers en maak een Nieuwe servergroepaan onder Lokale servergroepen.
Maak onder deze groep Nieuwe serverregistratieaan voor elke server die u wilt opvragen. Als de DB-namen verschillend zijn, zorg er dan voor dat u een standaard voor elk in de eigenschappen instelt.
Ga nu terug naar de groep die u in de eerste stap hebt gemaakt, klik met de rechtermuisknop en selecteer Nieuwe zoekopdracht. Er wordt een nieuw queryvenster geopend en elke query die u uitvoert, wordt uitgevoerd op elke server in de groep. De resultaten worden gepresenteerd in één dataset met een extra kolomnaam die aangeeft van welke server het record afkomstig is. Als u de statusbalk gebruikt, ziet u dat de servernaam is vervangen door multiple.
Antwoord 6, autoriteit 5%
probeer dit:
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
Antwoord 7, autoriteit 3%
Ik had hetzelfde probleem om een SQL_server 2008 te verbinden met een SQL_server 2016 gehost op een externe server. Andere antwoorden werkten niet direct voor mij. Ik schrijf mijn aangepaste oplossing hier omdat ik denk dat het nuttig kan zijn voor iemand anders.
Een uitgebreid antwoord voor externe IP db-verbindingen:
Stap 1: servers koppelen
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'
…waar SRV_NAME
een verzonnen naam is. We zullen het gebruiken om vanuit onze zoekopdrachten naar de externe server te verwijzen. aaa.bbb.ccc.ddd
is het ip-adres van de externe server die uw SQLserver-database host.
Stap 2: voer uw zoekopdrachten uit
Bijvoorbeeld:
SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table
…en dat is het!
Syntaxisdetails: sp_addlinkedserveren sp_addlinkedsrvlogin
Antwoord 8
Een gekoppelde serverdefinitie gemaakt in de ene server naar de andere (u hebt SA nodig om dit te doen), en verwijs er vervolgens naar met 4-delige naamgeving (zie BOL).
Antwoord 9
Server 2008:
Wanneer in SSMS verbonden met server1.DB1 en probeer:
SELECT * FROM
[server2].[DB2].[dbo].[table1]
zoals anderen al opmerkten, als het niet werkt, komt dat omdat de server niet is gekoppeld.
Ik krijg de foutmelding:
Kan server DB2 niet vinden in sys.servers. Controleer of de juiste
servernaam is opgegeven. Voer indien nodig de opgeslagen procedure uit
sp_addlinkedserver om de server toe te voegen aan sys.servers.
Om de server toe te voegen:
referentie: server toevoegen met sp_addlinkedserver
Link: [1]: Server toevoegen met sp_addlinkedserver
Als u wilt zien wat er op uw sys.servers staat, kunt u dit gewoon opvragen:
SELECT * FROM [sys].[servers]
Antwoord 10
Vereenvoudigde oplossing voor het toevoegen van gekoppelde servers
Eerste server
EXEC sp_addlinkedserver @server='ip,port\instancename'
Tweede login
EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'
Voer zoekopdrachten uit van gekoppeld aan lokale database
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]
Antwoord 11
select *
from [ServerName(IP)].[DatabaseName].[dbo].[TableName]
Antwoord 12
Zoals @Super9 vertelde over OPENDATASOURCE met behulp van SQL Server-verificatie met gegevensprovider
SQLOLEDB
. Ik plaats hier gewoon een codefragment voor één tabel in de huidige serverdatabase waar de code wordt uitgevoerd en een ander in een andere server ‘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
Antwoord 13
Ik weet dat dit een oude vraag is, maar ik gebruik synoniemen. Vermoedelijk wordt de query uitgevoerd binnen databaseserver A, en zoekt naar een tabel in een databaseserver B die niet bestaat op server A. Voeg dan een synoniem toe aan de A-database die uw tabel oproept vanaf server B. Uw query hoeft niet neem schema’s of verschillende databasenamen op, noem gewoon de tabelnaam zoals gewoonlijk en het zal werken.
Het is niet nodig om servers te linken, aangezien synoniemen eigenlijk een soort link zijn.
Antwoord 14
sp_addlinkedserver('servername')
dus het zou zo moeten gaan –
select * from table1
unionall
select * from [server1].[database].[dbo].[table1]
Antwoord 15
Serverobjecten—> gekoppelde server —> nieuwe gekoppelde server
In de gekoppelde server schrijft u de servernaam of het IP-adres voor de andere server en kiest u SQL Server
Selecteer in Beveiliging (worden gemaakt met behulp van deze beveiligingscontext)
Schrijf login en wachtwoord voor andere server
Nu verbonden, gebruik dan
Select * from [server name or ip addresses ].databasename.dbo.tblname