Condividi tramite


OPENROWSET (Transact-SQL)

Si applica a: SQL Server 2016 (13.x) e versioni successive

OPENROWSET è un'alternativa all'accesso alle tabelle in un server collegato ed è un metodo monouso ad hoc per la connessione e l'accesso ai dati remoti. Un OPENROWSET comando T-SQL include tutte le informazioni di connessione necessarie per accedere ai dati remoti da un'origine dati esterna.

È OPENROWSET possibile fare riferimento alla FROM funzione nella clausola di una query come se fosse un nome di tabella. È OPENROWSET anche possibile fare riferimento alla funzione come tabella di destinazione di un'istruzione INSERT, UPDATEo DELETE , soggetta alle funzionalità del provider di dati. Anche quando la query può restituire più set di risultati, la funzione OPENROWSET restituisce solo il primo set.

Suggerimento

Per riferimenti più frequenti a origini dati esterne, usare invece i server collegati. Per altre informazioni, vedere Server collegati (Motore di database).

OPENROWSET senza l'operatore BULK è disponibile solo in SQL Server. Dettagli e collegamenti a esempi simili su altre piattaforme:

Convenzioni relative alla sintassi Transact-SQL

Sintassi

OPENROWSET la sintassi viene usata per eseguire query su origini dati esterne:

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

Argomenti

'provider_name'

Stringa di caratteri che rappresenta il nome descrittivo (o PROGID) del provider di dati come specificato nel Registro di sistema. provider_name non ha un valore predefinito. Sono esempi di nomi di provider MSOLEDBSQL, Microsoft.Jet.OLEDB.4.0 o MSDASQL.

'datasource'

Costante stringa che corrisponde a una determinata origine dati. datasource è la DBPROP_INIT_DATASOURCE proprietà da passare all'interfaccia IDBProperties del provider per inizializzare il provider. In genere, questa stringa include il nome del file di database, il nome di un server di database o un nome che il provider riconosce per individuare il database o i database.

L'origine dati può essere il percorso di file C:\SAMPLES\Northwind.mdb' per il provider Microsoft.Jet.OLEDB.4.0 o la stringa di connessione Server=Seattle1;Trusted_Connection=yes; per il provider MSOLEDBSQL.

'user_id'

Costante stringa che corrisponde al nome utente passato al provider di dati specificato. user_id specifica il contesto di sicurezza per la connessione e viene passato come DBPROP_AUTH_USERID proprietà per inizializzare il provider. user_id non può essere un nome di accesso di Microsoft Windows.

'password'

Costante stringa che rappresenta la password utente da passare al provider di dati. la password viene passata come DBPROP_AUTH_PASSWORD proprietà durante l'inizializzazione del provider. password non può essere una password di Microsoft Windows. Per esempio:

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

'provider_string'

Un stringa di connessione specifico del provider passato come DBPROP_INIT_PROVIDERSTRING proprietà per inizializzare il provider OLE DB. In provider_string sono incluse in genere tutte le informazioni di connessione necessarie per inizializzare il provider.

Per un elenco di parole chiave riconosciute dal provider OLE DB di SQL Server Native Client, vedere Initialization and Authorization Properties (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). SQL Server Native Client (spesso abbreviato SNAC) è stato rimosso da SQL Server 2022 (16.x) e da SQL Server Management Studio 19 (SSMS). Il provider OLE DB di SQL Server Native Client (SQLNCLI o SQLNCLI11) e il provider OLE DB legacy Microsoft per SQL Server (SQLOLEDB) non sono consigliati per lo sviluppo di nuove applicazioni. In futuro, passare al nuovo driver Microsoft OLE DB (MSOLEDBSQL) per SQL Server.

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

[ catalogo. ] [ schema. ] oggetto

Tabella o vista remota che contiene i dati che devono essere letti da OPENROWSET. Può essere un oggetto con nome in tre parti con i componenti seguenti:

  • catalogo (facoltativo) - Nome del catalogo o del database contenente l'oggetto specificato.
  • schema (facoltativo) - Nome dello schema o del proprietario dell'oggetto specificato.
  • oggetto - Nome dell'oggetto che identifica in modo univoco l'oggetto da usare.
SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    AdventureWorks2022.HumanResources.Department
) AS d;

'query'

Costante stringa inviata ed eseguita dal provider. L'istanza locale di SQL Server non elabora questa query, ma elabora i risultati delle query restituiti dal provider, una query pass-through. Le query pass-through sono utili quando vengono usate nei provider che non rendono disponibili i dati tabulari tramite nomi di tabella, ma solo tramite una lingua di comando. Le query pass-through sono supportate nel server remoto, a condizione che il provider di query supporti l'oggetto OLE DB Command e le relative interfacce obbligatorie.

Per altre informazioni, vedere Interfacce OLE DB (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;

Osservazioni:

È possibile usare OPENROWSET per accedere ai dati remoti da origini dati OLE DB solo se l'opzione del Registro di sistema DisallowAdhocAccess è impostata esplicitamente su 0 per il provider specificato e l'opzione di configurazione avanzata Ad Hoc Distributed Queries è abilitata. Quando queste opzioni non sono impostate, il comportamento predefinito non consente l'accesso ad hoc.

Quando si accede a origini dati OLE DB remote, l'identità di accesso delle connessioni attendibili non viene delegata automaticamente dal server in cui il client è connesso al server su cui viene eseguita una query. È necessario configurare la delega dell'autenticazione.

I nomi di catalogo e schema sono necessari se il provider di dati supporta più cataloghi e schemi nell'origine dati specificata. I valori per catalog e schema possono essere omessi quando il provider di dati non li supporta. Se il provider supporta solo nomi di schema, è necessario specificare un nome in due parti del modulo schema.object . Se il provider supporta solo i nomi di catalogo, è necessario specificare un nome in tre parti del modulo catalog.schema.object . Per altre informazioni, vedere Convenzioni di sintassi Transact-SQL.

I nomi in tre parti sono necessari per le query pass-through che usano il provider OLE DB di SQL Server Native Client.

OPENROWSET non accetta variabili per i relativi argomenti.

Qualsiasi chiamata a OPENDATASOURCE, OPENQUERY r OPENROWSET nella clausola FROM viene valutata separatamente e indipendentemente da qualsiasi altra chiamata a queste funzioni usate come destinazione dell'aggiornamento, anche se alle due chiamate vengono forniti argomenti identici. In particolare, le condizioni di filtro o join applicate al risultato di una di tali chiamate non hanno effetto sui risultati dell'altra.

Autorizzazioni

OPENROWSET le autorizzazioni sono determinate dalle autorizzazioni del nome utente passato al provider di dati.

Esempi

In questa sezione vengono forniti esempi generali per illustrare come usare OPENROWSET.

Nota

Per esempi che illustrano l'uso INSERT...SELECT * FROM OPENROWSET(BULK...)di , vedere OPENROWSET BULK (Transact-SQL).

SQL Server Native Client (spesso abbreviato SNAC) è stato rimosso da SQL Server 2022 (16.x) e da SQL Server Management Studio 19 (SSMS). Il provider OLE DB di SQL Server Native Client (SQLNCLI o SQLNCLI11) e il provider OLE DB legacy Microsoft per SQL Server (SQLOLEDB) non sono consigliati per lo sviluppo di nuove applicazioni. In futuro, passare al nuovo driver Microsoft OLE DB (MSOLEDBSQL) per SQL Server.

R. Usare OPENROWSET con SELECT e il provider OLE DB di SQL Server Native Client

Nell'esempio seguente viene usato il provider OLE DB di SQL Server Native Client per accedere alla HumanResources.Department tabella nel AdventureWorks2022 database nel server Seattle1remoto . Usare MSOLEDBSQL per il moderno provider di dati OLE DB di Microsoft SQL Server che ha sostituito SQLNCLI. Viene utilizzata un'istruzione SELECT per definire il set di righe restituito. La stringa del provider contiene le parole chiave Server e Trusted_Connection. Queste parole chiave sono riconosciute dal provider OLE DB di 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. Usare il provider Microsoft OLE DB per Jet

Nell'esempio seguente viene ottenuto l'accesso alla tabella Customers del database Northwind di Microsoft Access tramite il provider Microsoft OLE DB per Jet.

Nota

In questo esempio si presuppone che Sia installato Microsoft Access. Per eseguire questo esempio, è necessario installare il Northwind database.

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

C. Usare OPENROWSET e un'altra tabella in un INNER JOIN

Nell'esempio seguente vengono selezionati tutti i dati della Customers tabella dall'istanza locale del database di SQL Server Northwind e dalla Orders tabella del database di Microsoft Access Northwind archiviato nello stesso computer.

Nota

In questo esempio si presuppone che Sia installato Microsoft Access. Per eseguire questo esempio, è necessario installare il Northwind database.

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;