Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In SQL Server esistono tre modi per eseguire una query in modalità remota:
OPENQUERY
OPENROWSET
EXECUTE AT
Questo articolo descrive questi tre metodi.
OPENQUERY
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
, UPDATE
o 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
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
, UPDATE
o 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
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:
- Esempi di Importazione ed Esportazione Massiva di Documenti XML (SQL Server)
- mantenere i valori Identity durante l'importazione bulk di dati (SQL Server)
- Mantenere i valori Null o Usare valori predefiniti durante l'importazione in blocco (SQL Server)
- Usare un file di formato per l'importazione di massa di dati (SQL Server)
- Usare il Formato Carattere per Importare o Esportare Dati (SQL Server)
- usare un file di formato per ignorare una colonna di tabella (SQL Server)
- Usare un file di formato per ignorare un campo dati (SQL Server)
- Usare un file di formato per eseguire il mapping delle colonne di tabella ai campi Data-File (SQL Server)
Vedere anche
- ELIMINA (Transact-SQL)
- FROM (Transact-SQL)
- Importazione ed Esportazione Massiva di Dati (SQL Server)
- INSERT (Transact-SQL)
- OPENDATASOURCE (Transact-SQL)
- OPENQUERY (Transact-SQL)
- OPENROWSET (Transact-SQL)
- SELECT (Transact-SQL)
- sp_addlinkedserver (Transact-SQL)
- sp_serveroption (Transact-SQL)
- AGGIORNAMENTO (Transact-SQL)
- WHERE (Transact-SQL)