Dela via


OPENROWSET (Transact-SQL)

gäller för: SQL Server 2016 (13.x) och senare versioner

OPENROWSET är ett alternativ till att komma åt tabeller på en länkad server och är en engångsmetod för ad hoc-anslutning och åtkomst till fjärrdata. Ett OPENROWSET T-SQL-kommando innehåller all anslutningsinformation som krävs för att komma åt fjärrdata från en extern datakälla.

Funktionen OPENROWSET kan refereras till i FROM-satsen i en fråga som om den vore ett tabellnamn. Funktionen OPENROWSET kan också refereras till som måltabellen för en INSERT, UPDATEeller DELETE -instruktion, med förbehåll för dataproviderns funktioner. Även om frågan kan returnera flera resultatuppsättningar returnerar OPENROWSET bara den första.

Tip

Om du vill ha mer frekventa referenser till externa datakällor använder du länkade servrar i stället. Mer information finns i länkade servrar (databasmotorn).

OPENROWSET utan att operatorn BULK endast är tillgänglig på SQL Server. Information och länkar till liknande exempel på andra plattformar:

Transact-SQL syntaxkonventioner

Syntax

OPENROWSET syntax används för att fråga externa datakällor:

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

Arguments

'provider_name'

En teckensträng som representerar dataproviderns eget namn (eller PROGID) enligt vad som anges i registret. provider_name har inget standardvärde. Exempel på providernamn är MSOLEDBSQL, Microsoft.Jet.OLEDB.4.0eller MSDASQL.

'datasource'

En strängkonstant som motsvarar en viss datakälla. datakälla är egenskapen DBPROP_INIT_DATASOURCE som ska skickas till providerns IDBProperties gränssnitt för att initiera providern. Den här strängen innehåller vanligtvis namnet på databasfilen, namnet på en databasserver eller ett namn som providern förstår för att hitta databasen eller databaserna.

Datakälla kan vara filsökväg C:\SAMPLES\Northwind.mdb' för Microsoft.Jet.OLEDB.4.0 provider eller anslutningssträng Server=Seattle1;Trusted_Connection=yes; för MSOLEDBSQL provider.

'user_id'

En strängkonstant som är användarnamnet som skickas till den angivna dataprovidern. user_id anger säkerhetskontexten för anslutningen och skickas som egenskapen DBPROP_AUTH_USERID för att initiera providern. user_id kan inte vara ett Inloggningsnamn för Microsoft Windows.

'password'

En strängkonstant som är användarlösenordet som ska skickas till dataprovidern. lösenord skickas som egenskapen DBPROP_AUTH_PASSWORD när providern initieras. lösenord kan inte vara ett Microsoft Windows-lösenord. For example:

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

'provider_string'

En providerspecifik anslutningssträng som skickas som egenskapen DBPROP_INIT_PROVIDERSTRING för att initiera OLE DB-providern. provider_string kapslar vanligtvis in all anslutningsinformation som krävs för att initiera providern.

En lista över nyckelord som SQL Server Native Client OLE DB-providern känner igen finns i Initierings- och auktoriseringsegenskaper (inbyggd OLE DB-klientprovider). Den interna SQL Server-klienten (ofta förkortad SNAC) har tagits bort från SQL Server 2022 (16.x) och SQL Server Management Studio 19 (SSMS). Både SQL Server Native Client OLE DB-providern (SQLNCLI eller SQLNCLI11) och den äldre Microsoft OLE DB-providern för SQL Server (SQLOLEDB) rekommenderas inte för ny utveckling. Växla till den nya Microsoft OLE DB Driver (MSOLEDBSQL) för SQL Server framöver.

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

[ catalog. ] [ schema. ] object

Fjärrtabell eller vy som innehåller de data som OPENROWSET ska läsa. Det kan vara ett objekt med tre delar med följande komponenter:

  • katalog (valfritt) – namnet på katalogen eller databasen där det angivna objektet finns.
  • schema (valfritt) – namnet på schemat eller objektägaren för det angivna objektet.
  • objekt – det objektnamn som unikt identifierar det objekt som ska arbetas med.
SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    AdventureWorks2022.HumanResources.Department
) AS d;

'query'

En strängkonstant som skickas till och körs av providern. Den lokala instansen av SQL Server bearbetar inte den här frågan, men bearbetar frågeresultat som returneras av providern, en direktfråga. Direktfrågor är användbara när de används på leverantörer som inte gör sina tabelldata tillgängliga via tabellnamn, utan bara via ett kommandospråk. Direktfrågor stöds på fjärrservern, så länge frågeprovidern stöder OLE DB-kommandoobjektet och dess obligatoriska gränssnitt.

Mer information finns i OLE DB-gränssnitt (SQL Server Native Client).

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

Remarks

OPENROWSET kan endast användas för att komma åt fjärrdata från OLE DB-datakällor när DisallowAdhocAccess registeralternativ uttryckligen anges till 0 för den angivna providern, och alternativet avancerad konfiguration för Ad Hoc Distributed Queries är aktiverat. När dessa alternativ inte har angetts tillåter standardbeteendet inte ad hoc-åtkomst.

När du kommer åt ole db-fjärrdatakällor delegeras inte inloggningsidentiteten för betrodda anslutningar automatiskt från servern där klienten är ansluten till den server som efterfrågas. Autentiseringsdelegering måste konfigureras.

Katalog- och schemanamn krävs om dataprovidern stöder flera kataloger och scheman i den angivna datakällan. Värden för catalog och schema kan utelämnas när dataprovidern inte stöder dem. Om providern endast stöder schemanamn måste ett tvådelade namn på formuläret schema.object anges. Om providern endast stöder katalognamn måste ett tredelade namn på formuläret catalog.schema.object anges. Mer information finns i Transact-SQL syntaxkonventioner.

Tredelade namn krävs för direktfrågor som använder SQL Server Native Client OLE DB-providern.

OPENROWSET accepterar inte variabler för sina argument.

Alla anrop till OPENDATASOURCE, OPENQUERYeller OPENROWSET i FROM-satsen utvärderas separat och oberoende av alla anrop till dessa funktioner som används som mål för uppdateringen, även om identiska argument skickas till de två anropen. I synnerhet har filter- eller kopplingsvillkor som tillämpas på resultatet av ett av dessa anrop ingen effekt på resultatet av det andra.

Permissions

OPENROWSET behörigheter bestäms av behörigheterna för det användarnamn som skickas till dataprovidern.

Limitations

Stöds inte med drivrutinen för Microsoft Access Database Engine.

Examples

Det här avsnittet innehåller allmänna exempel som visar hur du använder OPENROWSET.

Note

Exempel som visar hur du använder INSERT...SELECT * FROM OPENROWSET(BULK...)finns i OPENROWSET BULK (Transact-SQL).

Den interna SQL Server-klienten (ofta förkortad SNAC) har tagits bort från SQL Server 2022 (16.x) och SQL Server Management Studio 19 (SSMS). Både SQL Server Native Client OLE DB-providern (SQLNCLI eller SQLNCLI11) och den äldre Microsoft OLE DB-providern för SQL Server (SQLOLEDB) rekommenderas inte för ny utveckling. Växla till den nya Microsoft OLE DB Driver (MSOLEDBSQL) för SQL Server framöver.

A. Använda OPENROWSET med SELECT och SQL Server Native Client OLE DB-providern

I följande exempel används SQL Server Native Client OLE DB-providern för att komma åt tabellen HumanResources.Department i AdventureWorks2022-databasen på fjärrservern Seattle1. (Använd MSOLEDBSQL för den moderna Microsoft SQL Server OLE DB-dataprovidern som ersatte SQLNCLI.) En SELECT instruktion används för att definiera raduppsättningen som returneras. Providersträngen innehåller nyckelorden Server och Trusted_Connection. Dessa nyckelord identifieras av SQL Server Native Client OLE DB-providern.

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. Använda Microsoft OLE DB-providern för Jet

I följande exempel används tabellen Customers i Microsoft Access Northwind-databasen via Microsoft OLE DB-providern för Jet.

Note

Det här exemplet förutsätter att Microsoft Access är installerat. Om du vill köra det här exemplet måste du installera Northwind-databasen.

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

C. Använda OPENROWSET och en annan tabell i en INRE KOPPLING

I följande exempel markeras alla data från Customers tabellen från den lokala instansen Northwind av SQL Server-databasen Orders och från tabellen från Microsoft Access-databasen Northwind som lagras på samma dator.

Note

Det här exemplet förutsätter att Microsoft Access är installerat. Om du vill köra det här exemplet måste du installera Northwind-databasen.

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;