Gegevens selecteren van twee verschillende servers in SQL Server

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 dbois, 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:

  1. Serverobjecten -> Gekoppelde servers -> Nieuwe gekoppelde server

  2. Geef de naam van de externe server op.

  3. Selecteer het type externe server (SQL-server of anders).

  4. Selecteer Beveiliging -> Maak gebruik van deze beveiligingscontext en geef de login en het wachtwoord van de externe server op.

  5. 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:

  1. Gelinkte servers:bieden toegang tot een grotere verscheidenheid aan gegevensbronnen dan SQL Server-replicatie biedt
  2. Gelinkte servers:maak verbinding met gegevensbronnen die replicatie niet ondersteunt of waarvoor ad-hoctoegang is vereist
  3. Gelinkte servers:Presteren beter dan OPENDATASOURCE of OPENROWSET
  4. 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
  5. OPENQUERY: ondersteunt geen variabelen
  6. Allezijn T-SQL-oplossingen. Relatief eenvoudig te implementeren en in te stellen
  7. 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_NAMEeen verzonnen naam is. We zullen het gebruiken om vanuit onze zoekopdrachten naar de externe server te verwijzen. aaa.bbb.ccc.dddis 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

Other episodes