it-swarm.com.de

Auswählen von Daten von zwei verschiedenen Servern in SQL Server

Wie kann ich Daten in derselben Abfrage aus zwei verschiedenen Datenbanken auswählen, die sich auf zwei verschiedenen Servern in SQL Server befinden?

302
Don Of Qau

Ja, du kannst.

Ich denke, du fragst wie, also beantworte ich das.

Was Sie suchen, sind Linked Server. Sie können sie in SSMS von der folgenden Stelle in der Baumstruktur des Objekt-Explorers abrufen:

Server Objects-->Linked Servers

oder Sie können sp_addlinkedserver verwenden.

Sie müssen nur einen einrichten. Sobald Sie das haben, können Sie eine Tabelle auf dem anderen Server wie folgt aufrufen:

select
    *
from
    LocalTable,
    [OtherServerName].[OtherDB].[dbo].[OtherTable]

Beachten Sie, dass der Besitzer nicht immer dbo ist. Ersetzen Sie ihn daher durch das von Ihnen verwendete Schema.

306
Eric

Sie können dies mit Linked Server tun.

Normalerweise sind verknüpfte Server so konfiguriert, dass das Datenbankmodul eine Transact-SQL-Anweisung ausführen kann, die Tabellen in einer anderen Instanz von SQL Server oder einem anderen Datenbankprodukt wie Oracle enthält. Viele DB-Datenquellen vom Typ OLE können als Verbindungsserver konfiguriert werden, einschließlich Microsoft Access und Excel. 

Verknüpfte Server bieten folgende Vorteile:

  • Die Möglichkeit, auf Daten von außerhalb von SQL Server zuzugreifen.
  • Die Möglichkeit, verteilte Abfragen, Aktualisierungen, Befehle und Transaktionen für heterogene Datenquellen im gesamten Unternehmen auszugeben.
  • Die Fähigkeit, verschiedene Datenquellen ähnlich anzusprechen.

Lesen Sie mehr über Linked Server .

Führen Sie die folgenden Schritte aus, um einen Verbindungsserver zu erstellen:

  1. Serverobjekte -> Verbindungsserver -> Neuer Verbindungsserver

  2. Geben Sie den Namen des Remote-Servers an.

  3. Wählen Sie Remote Server Type aus (SQL Server oder Andere).

  4. Wählen Sie Sicherheit -> Verwenden Sie diesen Sicherheitskontext und geben Sie das Login und das Kennwort des Remote-Servers an.

  5. Klicken Sie auf OK und Sie sind fertig !!

Here ist ein einfaches Tutorial zum Erstellen eines Verbindungsservers.

ODER 

Sie können einen Verbindungsserver mithilfe von Query hinzufügen.

Syntax:

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] 
     [ , [ @provider= ] 'provider_name' ]
     [ , [ @datasrc= ] 'data_source' ] 
     [ , [ @location= ] 'location' ] 
     [ , [ @provstr= ] 'provider_string' ] 
     [ , [ @catalog= ] 'catalog' ] 

Lesen Sie mehr über sp_addlinkedserver .

Sie müssen den Verbindungsserver nur einmal anlegen. Nachdem Sie einen Verbindungsserver erstellt haben, können Sie ihn wie folgt abfragen:

select * from LinkedServerName.DatabaseName.OwnerName.TableName
85
Raging Bull
SELECT
        *
FROM
        [SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]

Sie können auch mithilfe von Linked Servers suchen. Verknüpfte Server können auch andere Arten von Datenquellen sein, z. B. DB2-Plattformen. Dies ist eine Methode, um über einen SQL Server TSQL- oder Sproc-Aufruf auf DB2 zuzugreifen.

24
RSolberg

Bei der Abfrage von zwei verschiedenen Datenbanken handelt es sich um eine verteilte Abfrage. Hier finden Sie eine Liste einiger Techniken sowie Vor- und Nachteile:

  1. Verknüpfte Server: Ermöglichen Sie den Zugriff auf eine größere Anzahl von Datenquellen als die SQL Server-Replikation
  2. Verknüpfte Server: Stellen Sie eine Verbindung mit Datenquellen her, die von der Replikation nicht unterstützt werden oder die Ad-hoc-Zugriff erfordern
  3. Verknüpfte Server: Bessere Leistung als OPENDATASOURCE oder OPENROWSET
  4. OPENDATASOURCEundOPENROWSETfunktionen: Praktisch für das Abrufen von Daten aus Datenquellen auf Ad-hoc-Basis. OPENROWSET verfügt auch über BULK-Funktionen, die möglicherweise keine Formatdatei benötigen, die möglicherweise fiddley ist
  5. OPENQUERY: Unterstützt keine Variablen
  6. Alle sind T-SQL-Lösungen. Relativ einfach zu implementieren und einzurichten
  7. Alle sind abhängig von der Verbindung zwischen Quelle und Ziel, die sich auf Leistung und Skalierbarkeit auswirken kann
21
super9

versuche dies:

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
14
Anna Karthi

Dies sind alles gute Antworten, aber diese fehlt, und sie hat ihre eigenen mächtigen Verwendungen. Möglicherweise passt es nicht zu dem, was das OP wollte, aber die Frage war vage und ich habe das Gefühl, dass andere ihren Weg hierher finden. Grundsätzlich können Sie ein Fenster verwenden, um gleichzeitig eine Abfrage für mehrere Server auszuführen.

Öffnen Sie im SSMS Registrierte Server und erstellen Sie eine Neue Servergruppe unter Lokale Servergruppen

Erstellen Sie in dieser Gruppe New Server Registration für jeden Server, den Sie abfragen möchten. Wenn sich die DB-Namen unterscheiden, stellen Sie sicher, dass Sie in den Eigenschaften einen Standard festlegen.

Gehen Sie nun zu der Gruppe zurück, die Sie im ersten Schritt erstellt haben, klicken Sie mit der rechten Maustaste und wählen Sie Neue Abfrage. Ein neues Abfragefenster wird geöffnet, und jede Abfrage, die Sie ausführen, wird auf jedem Server in der Gruppe ausgeführt. Die Ergebnisse werden in einem einzigen Datensatz dargestellt. Ein zusätzlicher Spaltenname gibt an, von welchem ​​Server der Datensatz stammt. Wenn Sie die Statusleiste verwenden, werden Sie feststellen, dass der Servername durch multiple ersetzt wird.

13
Paul

Ich hatte das gleiche Problem, um einen SQL_server 2008 mit einem SQL_server 2016 zu verbinden, der auf einem Remote-Server gehostet wird. Andere Antworten waren für mich nicht einfach. Ich schreibe hier meine optimierte Lösung, da ich denke, dass dies für andere nützlich sein kann.

Eine erweiterte Antwort für Remote-IP-Datenbankverbindungen:

Schritt 1: Server verbinden

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'

... wobei SRV_NAME ein erfundener Name ist. Wir werden es verwenden, um von unseren Abfragen auf den Remote-Server zu verweisen. aaa.bbb.ccc.ddd ist die IP-Adresse des Remote-Servers, auf dem sich Ihre SQL Server-Datenbank befindet.

Schritt 2: Führen Sie Ihre Abfragen .__ aus. Zum Beispiel:

SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table

...und das ist es!

Syntaxdetails: sp_addlinkedserver und sp_addlinkedsrvlogin

6
MarcM

Server 2008:

Wenn Sie sich in SSMS mit Server1.DB1 verbunden haben, versuchen Sie Folgendes:

SELECT  * FROM
[server2].[DB2].[dbo].[table1]

wie andere angemerkt haben, wenn es nicht funktioniert, liegt es daran, dass der Server nicht verbunden ist.

Ich bekomme den Fehler: 

Server-DB2 konnte in sys.servers nicht gefunden werden. Stellen Sie sicher, dass das richtige Servername wurde angegeben. Führen Sie ggf. die gespeicherte Prozedur .__ aus. sp_addlinkedserver, um den Server zu sys.servers hinzuzufügen.

So fügen Sie den Server hinzu:

referenz: Server mit sp_addlinkedserverLink hinzufügen: [1]: Server mit sp_addlinkedserver hinzufügen

Um zu sehen, was in Ihren sys.servers ist, fragen Sie es einfach ab:

SELECT * FROM [sys].[servers]
4
user3586922

Erstellen Sie eine Linked Server-Definition auf einem Server zum anderen (Sie benötigen dazu SA), und referenzieren Sie sie einfach mit 4-teiliger Benennung (siehe BOL).

3
RBarryYoung
 select * 
 from [ServerName(IP)].[DatabaseName].[dbo].[TableName]
2
Masum

Vereinfachte Lösung zum Hinzufügen von Verbindungsservern

Erster Server

EXEC sp_addlinkedserver @server='ip,port\instancename'

Zweiter Login

EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'

Führen Sie Abfragen aus, die mit der lokalen Datenbank verknüpft sind

INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]
0
irfandar

Ich weiß, das ist eine alte Frage, aber ich benutze Synonyme. Angenommen, die Abfrage wird innerhalb des Datenbankservers A ausgeführt und sucht nach einer Tabelle in einem Datenbankserver B, der auf Server A nicht vorhanden ist. Fügen Sie dann ein Synonym für eine Datenbank hinzu, die Ihre Tabelle von Server B aufruft. Ihre Abfrage muss nicht Fügen Sie beliebige Schemas oder andere Datenbanknamen ein. Rufen Sie den Tabellennamen wie gewohnt auf, und es funktioniert.

Es besteht keine Notwendigkeit, Server zu verknüpfen, da Synonyme per Spruch eine Art Verknüpfung darstellen.

0
sp_addlinkedserver('servername')

so sollte es so gehen -

select * from table1
unionall
select * from [server1].[database].[dbo].[table1]
0
ugio

As @ Super9 berichtete über OPENDATASOURCE mit der SQL Server-Authentifizierung beim Datenanbieter SQLOLEDB. Ich poste hier gerade ein Code-Snippet für eine Tabelle in der aktuellen Server-Datenbank, in der der Code läuft, und einen anderen auf einem anderen 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

Serverobjekte ---> Verbindungsserver ---> neuer Verbindungsserver

Geben Sie im Verbindungsserver den Servernamen oder die IP-Adresse für einen anderen Server ein und wählen Sie SQL Server Wählen Sie in Sicherheit (über diesen Sicherheitskontext festlegen) Geben Sie den Anmeldenamen und das Kennwort für den anderen Server ein 

Jetzt verbunden dann verwenden

Select * from [server name or ip addresses ].databasename.dbo.tblname
0
Sameh