Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In SQL Server gibt es drei Möglichkeiten, eine Abfrage remote auszuführen:
OPENQUERY
OPENROWSET
EXECUTE AT
In diesem Artikel werden diese drei Methoden beschrieben.
OPENQUERY
Führt die angegebene Pass-Through-Abfrage auf dem angegebenen Verbindungsserver aus. Bei diesem Server handelt es sich um eine OLE DB-Datenquelle. Verwenden Sie in einer Abfrage OPENQUERY
in FROM
, als handelte es sich dabei um einen Tabellennamen. Sie können auf OPENQUERY
auch als Zieltabelle einer INSERT
-, UPDATE
- oder DELETE
-Anweisung verweisen. Dies hängt von den Funktionen des OLE DB-Anbieters ab. Obwohl die Abfrage möglicherweise mehrere Resultsets zurückgibt, gibt OPENQUERY
nur das erste Resultset zurück.
OPENQUERY
erfordert einen vorab hinzugefügten und konfigurierten Verbindungsserver und einen Anforderungstext an einen Remoteserver.
OPENQUERY
erfordert keine vierteilige Namenskonvention für den Zugriff auf Objekte.
OPENROWSET
Enthält alle für einen Zugriff auf Remotedaten von einer OLE DB-Datenquelle notwendigen Verbindungsinformationen. Diese Methode ist eine Alternative zum Zugriff auf Tabellen eines Verbindungsservers. Sie ist eine einmalig verwendete Ad-hoc-Methode zum Verbinden und Zugreifen auf Remotedaten mithilfe von OLE DB. Für häufigere Verweise auf OLE DB-Datenquellen verwenden Sie ggf. Verbindungsserver, PolyBase oder direkte Verbindungen zwischen den beiden Datenquellen über Tools wie SQL Server Integration Services (SSIS) oder benutzerdefinierte Anwendungen.
Verwenden Sie in einer Abfrage OPENROWSET
in der FROM
-Klausel einer Abfrage. Sie können auch OPENROWSET
als Zieltabelle einer INSERT
-, UPDATE
- oder DELETE
-Anweisung verwenden, je nach den Funktionen des OLE DB-Anbieters. Obwohl die Abfrage möglicherweise mehrere Resultsets zurückgibt, gibt OPENROWSET
nur das erste Resultset zurück.
OPENROWSET
unterstützt auch Massenvorgänge über einen integrierten BULK
-Anbieter, mit dem Daten aus einer Datei gelesen und als Rowset zurückgegeben werden können.
OPENROWSET
verwendet eine explizit geschriebene Verbindungszeichenfolge, um weitere Informationen abzurufen.
EXECUTE AT
Ermöglicht die Ausführung von dynamischem SQL-Code für einen Verbindungsserver. Einer der Parameter des EXECUTE
-Aufrufs ist AT
. Mit ihm sollen die Einschränkungen von OPENQUERY
und OPENROWSET
umgangen werden.
EXECUTE (``<query>``) AT [<linked server>]
ist dynamischer SQL-Code, der eine beliebige Anzahl von Resultsets von einem Remoteserver zurückgeben kann.
Leitfaden für dynamischen SQL-Code
Vermeiden Sie die Verwendung dynamischer SQL-Befehle in Anwendungen, und beschränken Sie die Berechtigungen auf Benutzer mit Zugriff auf dynamische SQL-Befehle. Das Erstellen von Abfragen, die über EXECUTE
ausgeführt werden, kann zu Sicherheitsrisiken für Websites und Anwendungen über Angriffe mit Einschleusung von SQL-Befehlen führen. Weitere Informationen finden Sie unter Einschleusung von SQL-Befehlen.
Wenn die Leistung ein Problem ist, testen Sie Remoteabfragen:
- Stellen Sie sicher, dass möglichst viel Logik auf dem Remoteserver ausgeführt wird.
- Überprüfen Sie, ob die Indizes auf dem Remoteserver die Tabellen richtig indizieren, um die Abfrage zu unterstützen.
- Beachten Sie, dass die Verwendung von Remoteabfragen in einer Codebasis die Versionskontrolle von Datenbankcode und die Verwaltung von Entwicklungs- und Testumgebungen erschwert.
Beispiele
A. Ausführen einer SELECT-Pass-Through-Abfrage mit OPENQUERY
Im folgenden Beispiel wird eine SELECT-Pass-Through-Abfrage verwendet, um die Zeilen mit OPENQUERY
auszuwählen:
SELECT *
FROM OPENQUERY ([linkedserver],
'SELECT * FROM AdventureWorksLT.SalesLT.Customer');
B. Ausführen einer SELECT-Pass-Through-Abfrage mit OPENROWSET
Im folgenden Beispiel wird eine SELECT
-Pass-Through-Abfrage verwendet, um die Zeilen mit OPENROWSET
auszuwählen:
SELECT a.*
FROM OPENROWSET('MSOLEDBSQL', [linkedserver],
'SELECT * FROM AdventureWorksLT.SalesLT.Customer') AS a;
Der SQL Server Native Client (häufig abgekürzt mit SNAC) wurde aus SQL Server 2022 (16.x) und SQL Server Management Studio 19 (SSMS) entfernt. Sowohl der OLE DB-Anbieter für den SQL Server Native Client (SQLNCLI oder SQLNCLI11) als auch der Microsoft OLE DB-Legacyanbieter für SQL Server (SQLOLEDB) werden für Neuentwicklungen nicht empfohlen. Verwenden Sie in Zukunft den neuen Microsoft OLE DB-Treiber für SQL Server (MSOLEDBSQL).
C. Ausführen einer SELECT-Pass-Through-Abfrage mit EXECUTE AT
Im folgenden Beispiel wird eine SELECT
-Pass-Through-Abfrage verwendet, um die Zeilen mit EXECUTE ... AT
auszuwählen:
EXECUTE ('SELECT * FROM AdventureWorksLT.SalesLT.Customer') AT [linkedserver]
D: Ausführen mehrerer SELECT-Anweisungen
Im folgenden Beispiel wird eine SELECT
-Pass-Through-Abfrage verwendet, um mehrere Resultsets abzurufen:
EXECUTE ('SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.Customer;
SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.CustomerAddress;') AT [linkedserver];
E. Ausführen einer SELECT-Anweisung und Übergeben von zwei Argumenten
Im folgenden Beispiel wird eine SELECT
-Pass-Through-Abfrage mit zwei Argumenten verwendet:
EXECUTE ('SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.Customer
WHERE CustomerID = ? AND LastName = ?', 10, 'Garza') AT [linkedserver];
F. Ausführen einer SELECT-Anweisung und Übergeben von zwei Argumenten mithilfe von Variablen
Im folgenden Beispiel wird eine SELECT-Pass-Through-Abfrage mit zwei Argumenten unter Verwendung von Variablen verwendet:
DECLARE @CustomerID AS INT
DECLARE @LastName AS VARCHAR(100)
SET @CustomerID = 10
SET @LastName = 'Garza'
EXECUTE ('SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.Customer
WHERE CustomerID = ? AND LastName = ?', @CustomerID, @LastName) AT [linkedserver];
G. Ausführen von DDL-Anweisungen mit EXECUTE unter Verwendung von Verbindungsservern
Im folgenden Beispiel wird eine DDL-Anweisung auf dem Verbindungsserver verwendet:
EXECUTE (
'USE TempDB
IF OBJECT_ID(''dbo.Table1'') IS NOT NULL
DROP TABLE dbo.Table1
CREATE TABLE dbo.Table1
(
Column1 INT
)' ) AT [linkedserver];
Nachdem Sie die Tests abgeschlossen haben, bereinigen Sie erstellte Objekte:
EXECUTE (
'USE TempDB
IF OBJECT_ID(''dbo.Table1'') IS NOT NULL
DROP TABLE dbo.Table1'
) AT [linkedserver];
EXECUTE sp_dropserver 'linkedserver'
Zusätzliche Beispiele
Zusätzliche Beispiele für die Verwendung von INSERT...SELECT * FROM OPENROWSET(BULK...)
finden Sie in den folgenden Themen:
- Beispiele für den Massenimport und -export von XML-Dokumenten (SQL Server)
- Beibehalten von Identitätswerten beim Massenimport von Daten (SQL Server)
- Beibehalten von NULL-Werten oder Verwenden von Standardwerten während des Massenimports (SQL Server)
- Massenimport von Daten mithilfe einer Formatdatei (SQL Server)
- Verwenden des Zeichenformats zum Importieren oder Exportieren von Daten (SQL Server)
- Überspringen einer Tabellenspalte mithilfe einer Formatdatei (SQL Server)
- Auslassen eines Datenfelds mithilfe einer Formatdatei (SQL Server)
- Verwenden einer Formatdatei zum Zuordnen von Tabellenspalten zu Datendateifeldern (SQL Server)
Weitere Informationen
- DELETE (Transact-SQL)
- FROM (Transact-SQL)
- Massenimport und -export von Daten (SQL Server)
- INSERT (Transact-SQL)
- OPENDATASOURCE (Transact-SQL)
- OPENQUERY (Transact-SQL)
- OPENROWSET (Transact-SQL)
- SELECT (Transact-SQL)
- sp_addlinkedserver (Transact-SQL)
- sp_serveroption (Transact-SQL)
- UPDATE (Transact-SQL)
- WHERE (Transact-SQL)