Freigeben über


OPENROWSET (Transact-SQL)

Gilt für: SQL Server 2016 (13.x) und höhere Versionen

OPENROWSET ist eine Alternative zum Zugriff auf Tabellen auf einem verknüpften Server und ist eine einmalige Ad-hoc-Methode für die Verbindung und den Zugriff auf Remotedaten. Ein OPENROWSET T-SQL-Befehl enthält alle Verbindungsinformationen, die für den Zugriff auf Remotedaten aus einer externen Datenquelle erforderlich sind.

Auf die OPENROWSET Funktion kann in der FROM Klausel einer Abfrage verwiesen werden, als wäre sie ein Tabellenname. Auf die OPENROWSET Funktion kann auch als Zieltabelle eines Datenanbieters INSERToder UPDATE einer DELETEAnweisung verwiesen werden, die den Funktionen des Datenanbieters unterliegt. Obwohl die Abfrage möglicherweise mehrere Resultsets zurückgibt, gibt OPENROWSET nur das erste Resultset zurück.

Tipp

Verwenden Sie für häufigere Verweise auf externe Datenquellen stattdessen verknüpfte Server. Weitere Informationen finden Sie unter Verbindungsserver (Datenbank-Engine).

OPENROWSET ohne den BULK Operator ist nur in SQL Server verfügbar. Details und Links zu ähnlichen Beispielen auf anderen Plattformen:

Transact-SQL-Syntaxkonventionen

Syntax

OPENROWSET Die Syntax wird verwendet, um externe Datenquellen abzufragen:

OPENROWSET
(  'provider_name'
    , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
    , {  [ catalog. ] [ schema. ] object | 'query' }
)

Argumente

"provider_name"

Eine Zeichenfolge, die den Anzeigenamen (oder PROGID) des Datenanbieters darstellt, wie in der Registrierung angegeben. provider_name verfügt nicht über einen Standardwert. Beispiele für Anbieternamen sind die folgenden: MSOLEDBSQL, Microsoft.Jet.OLEDB.4.0 oder MSDASQL.

"Datenquelle"

Eine Zeichenfolgenkonstante, die einer bestimmten Datenquelle entspricht. Die Datenquelle ist die DBPROP_INIT_DATASOURCE Eigenschaft, die an die IDBProperties Schnittstelle des Anbieters übergeben werden soll, um den Anbieter zu initialisieren. In der Regel enthält diese Zeichenfolge den Namen der Datenbankdatei, den Namen eines Datenbankservers oder einen Namen, den der Anbieter zum Suchen der Datenbank oder Datenbanken versteht.

Die Datenquelle kann der Dateipfad C:\SAMPLES\Northwind.mdb' für Microsoft.Jet.OLEDB.4.0-Anbieter oder die Verbindungszeichenfolge Server=Seattle1;Trusted_Connection=yes; für MSOLEDBSQL-Anbieter sein.

"user_id"

Eine Zeichenfolgenkonstante, die den Benutzernamen an den angegebenen Datenanbieter übergeben hat. user_id gibt den Sicherheitskontext für die Verbindung an und wird als DBPROP_AUTH_USERID Eigenschaft übergeben, um den Anbieter zu initialisieren. user_id kann kein Microsoft Windows-Anmeldename sein.

"Kennwort"

Eine Zeichenfolgenkonstante, die das Benutzerkennwort ist, das an den Datenanbieter übergeben werden soll. Das Kennwort wird beim Initialisieren des Anbieters als DBPROP_AUTH_PASSWORD Eigenschaft übergeben. Kennwort kann kein Microsoft Windows-Kennwort sein. Zum Beispiel:

SELECT a.* FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\SAMPLES\Northwind.mdb';
    '<user name>';
    '<password>',
    Customers
) AS a;

"provider_string"

Eine anbieterspezifische Verbindungszeichenfolge, die DBPROP_INIT_PROVIDERSTRING als Eigenschaft übergeben wird, um den OLE DB-Anbieter zu initialisieren. provider_string kapselt normalerweise alle zum Initialisieren des Anbieters benötigten Verbindungsinformationen.

Eine Liste der Schlüsselwörter, die der OLE DB-Anbieter von SQL Server Native Client erkennt, finden Sie unter Initialisierungs- und Autorisierungseigenschaften (Native Client OLE DB Provider).For a list of keywords that the SQL Server Native Client OLE DB provider recognizes, see Initialization and Authorization Properties (Native Client OLE DB Provider). 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).

SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    Department
) AS d;

[ Katalog. ] [ Schema. ] -Objekt

Hier handelt es sich um die Remotetabelle oder die Ansicht, die die Daten enthält, die OPENROWSET lesen sollte. Dabei kann es sich um ein Objekt mit dreiteiligem Name bestehend aus den folgenden Komponenten handeln:

  • catalog (optional) ist der Name des Katalogs oder der Datenbank, in der sich das angegebene Objekt befindet.
  • schema (optional) ist der Name des Schemas oder des Besitzers für das angegebene Objekt.
  • object ist der Objektname, der das zu verwendende Objekt eindeutig identifiziert.
SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    AdventureWorks2022.HumanResources.Department
) AS d;

'Abfrage'

Eine Zeichenfolgenkonstante, die an den Anbieter gesendet und ausgeführt wird. Die lokale Instanz von SQL Server verarbeitet diese Abfrage nicht, verarbeitet aber Abfrageergebnisse, die vom Anbieter zurückgegeben werden, eine Pass-Through-Abfrage. Pass-Through-Abfragen sind nützlich, wenn sie für Anbieter verwendet werden, die ihre Tabellendaten nicht über Tabellennamen verfügbar machen, sondern nur über eine Befehlssprache. Pass-Through-Abfragen werden auf dem Remoteserver unterstützt, wenn der Abfrageanbieter das Command-Objekt von OLE DB und die dafür notwendigen Schnittstellen unterstützt.

Weitere Informationen finden Sie unter SQL Server Native Client (OLE DB)-Schnittstellen.

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT TOP 10 GroupName, Name FROM AdventureWorks2022.HumanResources.Department'
) AS a;

Hinweise

Mit OPENROWSET kann nur auf Remotedaten von OLE DB-Datenquellen zugegriffen werden, wenn für den angegebenen Anbieter die Registrierungsoption DisallowAdhocAccess explizit auf 0 festgelegt wird und wenn die erweiterte Konfigurationsoption „Ad Hoc Distributed Queries“ aktiviert ist. Wenn diese Optionen nicht festgelegt sind, lässt das Standardverhalten keinen Ad-hoc-Zugriff zu.

Wenn Sie auf Remote-OLE DB-Datenquellen zugreifen, wird die Anmeldeidentität vertrauenswürdiger Verbindungen nicht automatisch vom Server delegiert, auf dem der Client mit dem server verbunden ist, der abgefragt wird. Die Authentifizierungsdelegierung muss konfiguriert sein.

Katalog- und Schemanamen sind erforderlich, wenn der Datenanbieter mehrere Kataloge und Schemas in der angegebenen Datenquelle unterstützt. Werte für catalog und schema können weggelassen werden, wenn der Datenanbieter sie nicht unterstützt. Wenn der Anbieter nur Schemanamen unterstützt, muss ein zweiteiliger Name des Formulars schema.object angegeben werden. Wenn der Anbieter nur Katalognamen unterstützt, muss ein dreiteiliger Name des Formulars catalog.schema.object angegeben werden. Weitere Informationen finden Sie unter Transact-SQL-Syntaxkonventionen.

Dreiteilige Namen sind für Pass-Through-Abfragen erforderlich, die den OLE DB-Anbieter von SQL Server Native Client verwenden.

OPENROWSET akzeptiert keine Variablen für die zugehörigen Argumente.

Jeder Aufruf von OPENDATASOURCE, OPENQUERY oder OPENROWSET in der FROM-Klausel wird einzeln und unabhängig von anderen Aufrufen dieser Funktionen ausgewertet, die als Ziel des Updates verwendet werden, auch wenn für die beiden Aufrufe identische Argumente angegeben werden. Insbesondere haben Filter- oder Joinbedingungen, die auf das Ergebnis eines dieser Aufrufe angewendet werden, keine Auswirkungen auf die Ergebnisse des jeweils anderen.

Berechtigungen

OPENROWSET Berechtigungen werden durch die Berechtigungen des Benutzernamens bestimmt, der an den Datenanbieter übergeben wird.

Beispiele

Dieser Abschnitt enthält allgemeine Beispiele zur Veranschaulichen der Verwendung von OPENROWSET.

Hinweis

Beispiele für die Verwendung INSERT...SELECT * FROM OPENROWSET(BULK...)finden Sie unter OPENROWSET BULK (Transact-SQL).

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).

Ein. Verwenden von OPENROWSET mit SELECT und dem OLE DB-Anbieter für SQL Server Native Client

Im folgenden Beispiel wird der SQL Server Native Client-OLE DB-Anbieter für den Zugriff auf die HumanResources.Department-Tabelle in der AdventureWorks2022-Datenbank auf dem Remoteserver Seattle1 verwendet. (Wird MSOLEDBSQL für den modernen Microsoft SQL Server OLE DB-Datenanbieter verwendet, der ersetzt wurde SQLNCLI.) Eine SELECT Anweisung wird verwendet, um den zurückgegebenen Zeilensatz zu definieren. Die Anbieterzeichenfolge enthält die Schlüsselwörter Server und Trusted_Connection. Diese Schlüsselwörter werden vom OLE DB-Anbieter von SQL Server Native Client erkannt.

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL', 'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT GroupName, Name, DepartmentID
         FROM AdventureWorks2022.HumanResources.Department
         ORDER BY GroupName, Name'
) AS a;

B. Verwenden des Microsoft OLE DB-Anbieters für Jet

Im folgenden Beispiel wird mithilfe des Microsoft OLE DB-Anbieters für Jet auf die Customers-Tabelle in der Northwind-Datenbank von Microsoft Access zugegriffen.

Hinweis

In diesem Beispiel wird davon ausgegangen, dass Microsoft Access installiert ist. Zum Ausführen dieses Beispiels müssen Sie die Northwind Datenbank installieren.

SELECT CustomerID, CompanyName
FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
    'admin';'',
    Customers
);

C. Verwenden von OPENROWSET und einer anderen Tabelle in einer INNER JOIN

Im folgenden Beispiel werden alle Daten aus der Customers Tabelle aus der lokalen Instanz der SQL Server-Datenbank Northwind und aus der Tabelle aus der Orders Microsoft Access-Datenbank Northwind ausgewählt, die auf demselben Computer gespeichert ist.

Hinweis

In diesem Beispiel wird davon ausgegangen, dass Microsoft Access installiert ist. Zum Ausführen dieses Beispiels müssen Sie die Northwind Datenbank installieren.

USE Northwind;
GO

SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c
INNER JOIN OPENROWSET(
        'Microsoft.Jet.OLEDB.4.0',
        'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'',
        Orders) AS o
    ON c.CustomerID = o.CustomerID;