Condividi tramite


Confrontare le opzioni di esecuzione remota delle query

In SQL Server esistono tre modi per eseguire una query in modalità remota:

  • OPENQUERY
  • OPENROWSET
  • EXECUTE AT

Questo articolo descrive questi tre metodi.

OPENQUERY

OPENQUERY (Transact-SQL)

Esegue la query pass-through specificata nel server collegato specificato. Questo server è un'origine dati OLE DB. In una query usare OPENQUERY nel FROM come se fosse un nome di tabella. È anche possibile fare riferimento a OPENQUERY come tabella di destinazione di un'istruzione INSERT, UPDATEo DELETE. Ciò è soggetto alle funzionalità del provider OLE DB. Anche se la query può restituire più set di risultati, OPENQUERY restituisce solo la prima.

OPENQUERY richiede un server collegato già aggiunto e configurato e un testo di richiesta a un server remoto. OPENQUERY non richiede una convenzione dei nomi in quattro parti per accedere agli oggetti.

OPENROWSET

OPENROWSET (Transact-SQL)

Include tutte le informazioni di connessione necessarie per accedere ai dati remoti da un'origine dati OLE DB. Questo metodo è 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 tramite OLE DB. Per i riferimenti più frequenti alle origini dati OLE DB, è consigliabile usare server collegati, PolyBaseo connessioni dirette tra le due origini dati tramite strumenti come SQL Server Integration Services (SSIS) o applicazioni personalizzate.

In una query usare OPENROWSET nella clausola FROM di una query. È anche possibile usare OPENROWSET come tabella di destinazione di un'istruzione INSERT, UPDATEo DELETE, soggetta alle funzionalità del provider OLE DB. Anche se la query potrebbe restituire più set di risultati, OPENROWSET restituisce solo la prima.

OPENROWSET supporta anche operazioni bulk tramite un provider di BULK predefinito che consente la lettura e la restituzione dei dati da un file come set di righe.

Per ulteriori informazioni, OPENROWSET usare una stringa di connessione esplicitamente scritta.

ESEGUI A

EXECUTE (Transact-SQL)

Consente l'esecuzione dinamica di SQL su un server collegato. Uno dei parametri della chiamata EXECUTE è AT, progettato per ignorare le restrizioni di OPENQUERY e OPENROWSET. EXECUTE (``<query>``) AT [<linked server>] è SQL dinamico che può restituire un numero qualsiasi di set di risultati da un server remoto.

Linee guida per SQL dinamico

Evitare l'uso di comandi SQL dinamici nelle applicazioni e limitare le autorizzazioni per gli utenti con accesso ai comandi SQL dinamici. La creazione di query da eseguire tramite EXECUTE può creare vulnerabilità ai siti Web e alle applicazioni tramite attacchi SQL Injection. Per altre informazioni, vedere SQL Injection.

Quando le prestazioni sono un problema, testa le query remote.

  • Verificare che la maggior parte della logica possibile venga eseguita nel server remoto
  • Verificare gli indici nelle tabelle di indice del server remoto in modo appropriato per supportare la query
  • Tenere presente che l'uso di query remote in una codebase complica il controllo della versione del codice del database e la manutenzione degli ambienti di sviluppo e test

Esempi

Un. Eseguire una query pass-through SELECT con OPENQUERY

Nell'esempio seguente viene usata una query SELECT pass-through per selezionare le righe con OPENQUERY:

SELECT * 
    FROM OPENQUERY ([linkedserver], 
        'SELECT * FROM AdventureWorksLT.SalesLT.Customer');  

B. Eseguire una query pass-through SELECT con OPENROWSET

Nell'esempio seguente viene utilizzata una query pass-through di SELECT per selezionare le righe con OPENROWSET

SELECT a.*
FROM OPENROWSET('MSOLEDBSQL', [linkedserver],
     'SELECT * FROM AdventureWorksLT.SalesLT.Customer') AS a;

Il SQL Server Native Client (spesso abbreviato SNAC) è stato rimosso da SQL Server 2022 (16.x) e SQL Server Management Studio 19 (SSMS). Non è consigliabile utilizzare sia il provider OLE DB SQL Server Native Client (SQLNCLI o SQLNCLI11) sia il provider Microsoft OLE DB legacy per SQL Server (SQLOLEDB) per nuovi sviluppi. Passare al nuovo Microsoft OLE DB Driver (MSOLEDBSQL) per SQL Server d'ora in poi.

C. Eseguire una query pass-through SELECT con EXECUTE AT

Nell'esempio seguente viene utilizzata una query pass-through di SELECT per selezionare le righe con EXECUTE ... AT

EXECUTE ('SELECT * FROM AdventureWorksLT.SalesLT.Customer') AT [linkedserver]

D. Eseguire più istruzioni SELECT

Nell'esempio seguente viene usata una query SELECT pass-through e viene ottenuto più set di risultati

EXECUTE ('SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.Customer;
    SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.CustomerAddress;') AT [linkedserver];

E. Eseguire un'istruzione SELECT e passare due argomenti

Nell'esempio seguente viene usato un SELECT pass-through con due argomenti

EXECUTE ('SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.Customer 
WHERE CustomerID = ? AND LastName = ?', 10, 'Garza') AT [linkedserver];

F. Eseguire una query SELECT e passare due argomenti, usando delle variabili

L'esempio seguente usa un'istruzione SELECT pass-through con due argomenti usando le variabili

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. Eseguire istruzioni DDL con EXECUTE usando server collegati

Nell'esempio seguente viene utilizzata un'istruzione DDL nel server collegato

EXECUTE (
'USE TempDB
IF OBJECT_ID(''dbo.Table1'') IS NOT NULL
DROP TABLE dbo.Table1
CREATE TABLE dbo.Table1
(
    Column1 INT
)' ) AT [linkedserver];

Dopo aver completato i test, pulire gli oggetti creati

EXECUTE (
'USE TempDB
IF OBJECT_ID(''dbo.Table1'') IS NOT NULL
DROP TABLE dbo.Table1'
) AT [linkedserver];
EXECUTE sp_dropserver 'linkedserver'

Altri esempi

Per altri esempi che illustrano l'uso di INSERT...SELECT * FROM OPENROWSET(BULK...), vedere gli argomenti seguenti:

Vedere anche