In Management Studio versuche ich, eine Abfrage/einen Join zwischen zwei Verbindungsservern auszuführen. Ist dies eine korrekte Syntax, die verknüpfte Datenbankserver verwendet:
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
Im Allgemeinen stellen Sie der DB-Tabelle nur den Namen des DB-Servers vor.
Das Format sollte wahrscheinlich sein:
<server>.<database>.<schema>.<table>
Zum Beispiel: DatabaseServer1.db1.dbo.table1
Update: Ich weiß, dass dies eine alte Frage ist und die Antwort, die ich habe, richtig ist. Ich denke jedoch, dass jeder, der darüber stolpert, ein paar Dinge wissen sollte.
Wenn Sie in einer Join-Situation einen Verbindungsserver abfragen, wird die Tabelle GESAMT vom Verbindungsserver wahrscheinlich auf den Server heruntergeladen, von dem aus die Abfrage ausgeführt wird, um das auszuführen Operation beitreten. Im Falle des OP werden sowohl table1
von DB1
als auch table1
von DB2
vollständig an den Server übertragen, der die Abfrage ausführt, vermutlich DB3
.
Wenn Sie große Tabellen haben, kann dies mit may zu einer Operation führen, deren Ausführung lange dauert. Immerhin ist es jetzt durch Netzwerkverkehrsgeschwindigkeiten eingeschränkt, die um Größenordnungen langsamer sind als Speicher- oder sogar Plattenübertragungsgeschwindigkeiten.
Wenn möglich, führen Sie eine einzelne Abfrage für den Remote-Server aus, ohne sich einer lokalen Tabelle anzuschließen, um die erforderlichen Daten in eine temporäre Tabelle zu ziehen. Dann fragen Sie das ab.
Wenn dies nicht möglich ist, müssen Sie die verschiedenen Aspekte prüfen, durch die der SQL Server die gesamte Tabelle lokal laden muss. Zum Beispiel mit GETDATE()
oder sogar bestimmten Joins. Andere Leistungskiller beinhalten das Nichtgeben entsprechender Rechte.
Weitere Informationen erhalten Sie unter http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ .
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
Das kann dir helfen.
Wenn Sie immer noch ein Problem mit <server>.<database>.<schema>.<table>
finden
Servernamen in []
einschließen
Sie müssen das Schema/Eigentümer (standardmäßig Dbo) als Teil der Referenz angeben. Es ist auch vorzuziehen, den neueren Verbindungsstil (ANSI-92) zu verwenden.
select foo.id
from databaseserver1.db1.dbo.table1 foo
inner join databaseserver2.db1.dbo.table1 bar
on foo.name = bar.name
Falls Sie Probleme mit diesen anderen Antworten haben, versuchen Sie OPENQUERY
Beispiel:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
select * from [Server].[database].[schema].[tablename]
Dies ist der richtige Weg, um anzurufen. Stellen Sie sicher, dass die Server verbunden sind, bevor Sie die Abfrage ausführen.
So prüfen Sie, ob Verbindungsserver angerufen werden:
EXEC sys.sp_linkedservers
select name from drsql01.test.dbo.employee
Ich hoffe, es hilft zu verstehen, wie die Abfrage für den Verbindungsserver ausgeführt wird
Bei Verbindungsservern sollten normalerweise keine direkten Abfragen verwendet werden, da die temporäre Datenbank des SQL-Servers stark verwendet wird. Im ersten Schritt werden Daten in die temporäre Datenbank abgerufen, und es erfolgt eine Filterung. Es gibt viele Fäden darüber. Es ist besser, open OPENQUERY zu verwenden, da es SQL an den Quellverbindungsserver übergibt und dann gefilterte Ergebnisse zurückgibt, z.
SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
Folgende Abfrage funktioniert am besten.
Versuchen Sie diese Abfrage:
SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')
Es hilft sehr, MySQL mit MS SQL zu verknüpfen
Für das, was es wert ist, habe ich die folgende Syntax gefunden, um am besten zu funktionieren:
SELECT * FROM [LINKED_SERVER] ... [TABLE]
Ich konnte die Empfehlungen anderer nicht verwenden, indem ich den Datenbanknamen verwendete. Darüber hinaus hat diese Datenquelle kein Schema.