Delen via


OPENROWSET (Transact-SQL)

Van toepassing op: SQL Server 2016 (13.x) en latere versies

OPENROWSET is een alternatief voor het openen van tabellen op een gekoppelde server en is een eenmalige ad-hocmethode voor het verbinden en openen van externe gegevens. Een OPENROWSET T-SQL-opdracht bevat alle verbindingsgegevens die vereist zijn voor toegang tot externe gegevens vanuit een externe gegevensbron.

De functie OPENROWSET kan worden verwezen in de FROM component van een query alsof deze een tabelnaam is. Er OPENROWSET kan ook naar de functie worden verwezen als de doeltabel van een INSERT, UPDATEof DELETE instructie, afhankelijk van de mogelijkheden van de gegevensprovider. Hoewel de query meerdere resultatensets kan retourneren, retourneert OPENROWSET slechts de eerste.

Tip

Gebruik in plaats daarvan gekoppelde servers voor frequentere verwijzingen naar externe gegevensbronnen. Zie Gekoppelde servers (Database Engine)voor meer informatie.

OPENROWSET zonder de BULK operator is alleen beschikbaar op SQL Server. Details en koppelingen naar vergelijkbare voorbeelden op andere platforms:

Transact-SQL syntaxisconventies

Syntax

OPENROWSET syntaxis wordt gebruikt om een query uit te voeren op externe gegevensbronnen:

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

Arguments

'provider_name'

Een tekenreeks die de beschrijvende naam (of PROGID) van de gegevensprovider vertegenwoordigt, zoals opgegeven in het register. provider_name heeft geen standaardwaarde. Voorbeelden van providernamen zijn MSOLEDBSQL, Microsoft.Jet.OLEDB.4.0of MSDASQL.

'datasource'

Een tekenreeksconstante die overeenkomt met een bepaalde gegevensbron. gegevensbron is de DBPROP_INIT_DATASOURCE eigenschap die moet worden doorgegeven aan de IDBProperties-interface van de provider om de provider te initialiseren. Deze tekenreeks bevat doorgaans de naam van het databasebestand, de naam van een databaseserver of een naam die de provider begrijpt voor het zoeken naar de database of databases.

De gegevensbron kan een bestandspad zijn C:\SAMPLES\Northwind.mdb' voor Microsoft.Jet.OLEDB.4.0 provider of verbindingsreeks Server=Seattle1;Trusted_Connection=yes; voor MSOLEDBSQL provider.

'user_id'

Een tekenreeksconstante die de gebruikersnaam is die wordt doorgegeven aan de opgegeven gegevensprovider. user_id geeft de beveiligingscontext voor de verbinding op en wordt doorgegeven als de eigenschap DBPROP_AUTH_USERID om de provider te initialiseren. user_id kan geen microsoft Windows-aanmeldingsnaam zijn.

'password'

Een tekenreeksconstante die het gebruikerswachtwoord is dat moet worden doorgegeven aan de gegevensprovider. wachtwoord wordt doorgegeven als de eigenschap DBPROP_AUTH_PASSWORD bij het initialiseren van de provider. wachtwoord kan geen Microsoft Windows-wachtwoord zijn. For example:

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

'provider_string'

Een providerspecifieke verbindingsreeks die wordt doorgegeven als de eigenschap DBPROP_INIT_PROVIDERSTRING om de OLE DB-provider te initialiseren. provider_string bevat doorgaans alle verbindingsgegevens die nodig zijn om de provider te initialiseren.

Zie voor een lijst met trefwoorden die de OLE DB-provider van sql Server Native Client herkent initialisatie- en autorisatie-eigenschappen (Native Client OLE DB Provider). De SQL Server Native Client (vaak afgekort SNAC) is verwijderd uit SQL Server 2022 (16.x) en SQL Server Management Studio 19 (SSMS). Zowel de SQL Server Native Client OLE DB-provider (SQLNCLI of SQLNCLI11) als de verouderde Microsoft OLE DB-provider voor SQL Server (SQLOLEDB) worden niet aanbevolen voor nieuwe ontwikkeling. Schakel over naar het nieuwe Microsoft OLE DB-stuurprogramma (MSOLEDBSQL) voor SQL Server.

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

[ catalog. ] [ schema. ] object

Externe tabel of weergave met de gegevens die OPENROWSET moeten lezen. Het kan een driedelige naamobject zijn met de volgende onderdelen:

  • catalogus (optioneel): de naam van de catalogus of database waarin het opgegeven object zich bevindt.
  • schema (optioneel): de naam van het schema of de objecteigenaar voor het opgegeven object.
  • object: de objectnaam waarmee het object uniek wordt geïdentificeerd.
SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    AdventureWorks2022.HumanResources.Department
) AS d;

'query'

Een tekenreeksconstante die door de provider wordt verzonden en uitgevoerd. De lokale instantie van SQL Server verwerkt deze query niet, maar verwerkt queryresultaten die door de provider worden geretourneerd, een passthrough-query. Passthrough-query's zijn handig wanneer ze worden gebruikt voor providers die hun tabelgegevens niet beschikbaar maken via tabelnamen, maar alleen via een opdrachttaal. Passthrough-query's worden ondersteund op de externe server, zolang de queryprovider het OLE DB-opdrachtobject en de verplichte interfaces ondersteunt.

Zie OLE DB-interfaces (SQL Server Native Client)voor meer informatie.

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

Remarks

OPENROWSET kan alleen worden gebruikt voor toegang tot externe gegevens uit OLE DB-gegevensbronnen wanneer de registeroptie DisallowAdhocAccess expliciet is ingesteld op 0 voor de opgegeven provider en de geavanceerde configuratieoptie Ad Hoc gedistribueerde query's is ingeschakeld. Wanneer deze opties niet zijn ingesteld, is het standaardgedrag niet toegestaan voor ad-hoctoegang.

Wanneer u externe OLE DB-gegevensbronnen opent, wordt de aanmeldings-id van vertrouwde verbindingen niet automatisch gedelegeerd vanaf de server waarop de client is verbonden met de server waarop een query wordt uitgevoerd. Verificatiedelegering moet worden geconfigureerd.

Catalogus- en schemanamen zijn vereist als de gegevensprovider ondersteuning biedt voor meerdere catalogi en schema's in de opgegeven gegevensbron. Waarden voor catalog en schema kunnen worden weggelaten wanneer de gegevensprovider deze niet ondersteunt. Als de provider alleen schemanamen ondersteunt, moet een tweedelige naam van het formulier schema.object worden opgegeven. Als de provider alleen catalogusnamen ondersteunt, moet er een driedelige naam van het formulier catalog.schema.object worden opgegeven. Zie Transact-SQL syntaxisconventiesvoor meer informatie.

Namen van drie delen zijn vereist voor passthrough-query's die gebruikmaken van de OLE DB-provider van sql Server Native Client.

OPENROWSET accepteert geen variabelen voor de argumenten.

Elke aanroep van OPENDATASOURCE, OPENQUERYof OPENROWSET in de FROM component wordt afzonderlijk en onafhankelijk van elke aanroep naar deze functies die worden gebruikt als doel van de update, zelfs als identieke argumenten aan de twee aanroepen worden verstrekt. Met name filter- of joinvoorwaarden die zijn toegepast op het resultaat van een van deze aanroepen, hebben geen invloed op de resultaten van de andere.

Permissions

OPENROWSET machtigingen worden bepaald door de machtigingen van de gebruikersnaam die wordt doorgegeven aan de gegevensprovider.

Limitations

Niet ondersteund met microsoft Access Database Engine-stuurprogramma.

Examples

In deze sectie vindt u algemene voorbeelden om te laten zien hoe u OPENROWSET gebruikt.

Note

Zie INSERT...SELECT * FROM OPENROWSET(BULK...)voor voorbeelden die het gebruik weergeven.

De SQL Server Native Client (vaak afgekort SNAC) is verwijderd uit SQL Server 2022 (16.x) en SQL Server Management Studio 19 (SSMS). Zowel de SQL Server Native Client OLE DB-provider (SQLNCLI of SQLNCLI11) als de verouderde Microsoft OLE DB-provider voor SQL Server (SQLOLEDB) worden niet aanbevolen voor nieuwe ontwikkeling. Schakel over naar het nieuwe Microsoft OLE DB-stuurprogramma (MSOLEDBSQL) voor SQL Server.

A. OPENROWSET gebruiken met SELECT en de OLE DB-provider van de SQL Server-client

In het volgende voorbeeld wordt de OLE DB-provider van sql Server Native Client gebruikt voor toegang tot de HumanResources.Department tabel in de AdventureWorks2022-database op de externe server Seattle1. (Gebruik MSOLEDBSQL dit voor de moderne Microsoft SQL Server OLE DB-gegevensprovider die is vervangen SQLNCLI.) Er wordt een SELECT instructie gebruikt om de geretourneerde rijset te definiëren. De providertekenreeks bevat de Server en Trusted_Connection trefwoorden. Deze trefwoorden worden herkend door de OLE DB-provider van sql Server Native Client.

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. De Microsoft OLE DB-provider voor Jet gebruiken

In het volgende voorbeeld wordt de Customers tabel in de Microsoft Access Northwind-database geopend via de Microsoft OLE DB-provider voor Jet.

Note

In dit voorbeeld wordt ervan uitgegaan dat Microsoft Access is geïnstalleerd. Als u dit voorbeeld wilt uitvoeren, moet u de Northwind-database installeren.

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

C. OPENROWSET en een andere tabel in een INNER JOIN gebruiken

In het volgende voorbeeld worden alle gegevens uit de Customers tabel geselecteerd uit het lokale exemplaar van de SQL Server-database Northwind en uit de Orders tabel uit de Microsoft Access-database Northwind die is opgeslagen op dezelfde computer.

Note

In dit voorbeeld wordt ervan uitgegaan dat Microsoft Access is geïnstalleerd. Als u dit voorbeeld wilt uitvoeren, moet u de Northwind-database installeren.

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;