Wie kann ich Daten in derselben Abfrage aus zwei verschiedenen Datenbanken auswählen, die sich auf zwei verschiedenen Servern in SQL Server befinden?
Wie kann ich Daten in derselben Abfrage aus zwei verschiedenen Datenbanken auswählen, die sich auf zwei verschiedenen Servern in SQL Server befinden?
Antworten:
Was Sie suchen, sind Verbindungsserver. Sie können sie in SSMS von der folgenden Stelle in der Baumstruktur des Objekt-Explorers aus erreichen:
Server Objects-->Linked Servers
oder Sie können sp_addlinkedserver verwenden .
Sie müssen nur eine 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 Eigentümer nicht immer dbo
ist. Ersetzen Sie ihn daher durch das von Ihnen verwendete Schema.
[OtherServerName].[OtherDB]..[OtherTable]
jedoch am besten, es einzuschließen, wenn es bekannt ist.
Sie können dies mit Linked Server tun.
In der Regel sind Verbindungsserver 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 Arten von OLE DB-Datenquellen können als Verbindungsserver konfiguriert werden, einschließlich Microsoft Access und Excel.
Verbindungsserver bieten folgende Vorteile:
Lesen Sie mehr über Verbindungsserver .
Serverobjekte -> Verbindungsserver -> Neuer Verbindungsserver
Geben Sie den Namen des Remote-Servers an.
Wählen Sie Remote Server Type (SQL Server oder Andere).
Wählen Sie Sicherheit -> In diesem Sicherheitskontext erstellen und geben Sie die Anmeldung und das Kennwort des Remote-Servers an.
Klicken Sie auf OK und Sie sind fertig !!
Hier ist ein einfaches Tutorial zum Erstellen eines Verbindungsservers.
ODER
Sie können einen Verbindungsserver mithilfe einer Abfrage 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 erstellen . Nach dem Erstellen des Verbindungsservers können wir ihn wie folgt abfragen:
select * from LinkedServerName.DatabaseName.OwnerName.TableName
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
Sie können sich auch die Verwendung von Verbindungsservern ansehen. Verbindungsserver können auch andere Arten von Datenquellen sein, z. B. DB2-Plattformen. Dies ist eine Methode für den Versuch, über einen SQL Server-TSQL- oder Sproc-Aufruf auf DB2 zuzugreifen ...
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.
Das Abfragen über 2 verschiedene Datenbanken ist eine verteilte Abfrage. Hier ist eine Liste einiger Techniken sowie der Vor- und Nachteile:
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
Dies sind alles gute Antworten, aber diese fehlt und hat ihre eigenen mächtigen Verwendungszwecke. Möglicherweise passt es nicht zu dem, was das OP wollte, aber die Frage war vage und ich glaube, andere finden hier ihren Weg. Grundsätzlich können Sie 1 Fenster verwenden, um gleichzeitig eine Abfrage für mehrere Server auszuführen. So geht's:
Öffnen Sie in SSMS Registrierte Server und erstellen Sie eine neue Servergruppe unter Lokale Servergruppen .
Erstellen Sie unter dieser Gruppe eine neue Serverregistrierung für jeden Server, den Sie abfragen möchten. Wenn die DB-Namen unterschiedlich sind, stellen Sie sicher, dass für jeden in den Eigenschaften ein Standard festgelegt wird.
Kehren 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 von Ihnen ausgeführte Abfrage wird auf jedem Server in der Gruppe ausgeführt. Die Ergebnisse werden in einem einzelnen Datensatz mit einem zusätzlichen Spaltennamen dargestellt, der angibt, von welchem Server der Datensatz stammt. Wenn Sie die Statusleiste verwenden, werden Sie feststellen, dass der Servername durch mehrere ersetzt wird .
Ich hatte das gleiche Problem beim Verbinden eines SQL_Servers 2008 mit einem SQL_Server 2016, der auf einem Remote-Server gehostet wird. Andere Antworten haben bei mir nicht einfach funktioniert. Ich schreibe hier meine optimierte Lösung, da ich denke, dass sie für jemand anderen 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'
... wo SRV_NAME
ist ein erfundener Name. Wir werden es verwenden, um aus 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!
Erstellt eine Verknüpfungsserverdefinition auf einem Server zum anderen (Sie benötigen dazu SA) und verweisen sie dann einfach mit einer 4-teiligen Benennung (siehe BOL).
Server 2008:
Wenn Sie in SSMS mit server1.DB1 verbunden sind, versuchen Sie Folgendes:
SELECT * FROM
[server2].[DB2].[dbo].[table1]
Wie andere angemerkt haben, liegt es daran, dass der Server nicht verbunden ist, wenn es nicht funktioniert.
Ich bekomme den Fehler:
Server DB2 konnte in sys.servers nicht gefunden werden. Stellen Sie sicher, dass der richtige Servername angegeben wurde. Führen Sie bei Bedarf die gespeicherte Prozedur sp_addlinkedserver aus, um den Server zu sys.servers hinzuzufügen.
So fügen Sie den Server hinzu:
Referenz: So fügen Sie einen Server mit sp_addlinkedserver hinzu Link: [1]: So fügen Sie einen Server mit sp_addlinkedserver hinzu
Um zu sehen, was sich in Ihren sys.servern befindet, fragen Sie es einfach ab:
SELECT * FROM [sys].[servers]
Wie @ Super9 über OPENDATASOURCE mit SQL Server-Authentifizierung mit dem Datenprovider SQLOLEDB berichtete . Ich poste hier nur ein Code-Snippet für eine Tabelle in der aktuellen Server - Datenbank, in der der Code ausgeführt wird, und eine andere in 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
Ich weiß, dass dies eine alte Frage ist, aber ich verwende Synonyme. Angeblich wird die Abfrage auf dem Datenbankserver A ausgeführt und sucht nach einer Tabelle in einem Datenbankserver B, die 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 hinzu. Rufen Sie einfach den Tabellennamen wie gewohnt auf, und es funktioniert.
Es ist nicht erforderlich, Server zu verknüpfen, da Synonyme per say eine Art Verknüpfung darstellen.
Serverobjekte ---> Verbindungsserver ---> Neuer Verbindungsserver
Schreiben Sie im Verbindungsserver den Servernamen oder die IP-Adresse für einen anderen Server und wählen Sie SQL Server. Wählen Sie unter Sicherheit die Option (in diesem Sicherheitskontext erstellt). Schreiben Sie die Anmeldung und das Kennwort für einen anderen Server
Jetzt verbunden, dann verwenden
Select * from [server name or ip addresses ].databasename.dbo.tblname
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 von einer verknüpften lokalen Datenbank aus
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]