Porovnání možností vzdáleného spouštění dotazů

Na SQL Serveru existují tři způsoby vzdáleného spuštění dotazu:

  • OPENQUERY
  • OPENROWSET
  • EXECUTE AT

Tento článek popisuje tyto tři metody.

OPENQUERY

OPENQUERY (Transact-SQL)

Provede zadaný předávací dotaz na zadaném propojeném serveru. Tento server je zdrojem dat OLE DB. V dotazu použijte OPENQUERY v FROM, jako by se jednalo o název tabulky. Na tabulku OPENQUERY můžete také odkazovat jako na cílovou tabulku příkazu INSERT, UPDATEnebo DELETE. To podléhá schopnostem zprostředkovatele OLE DB. I když dotaz může vrátit více sad výsledků, OPENQUERY vrátí pouze první sadu výsledků.

OPENQUERY vyžaduje předem přidaný a nakonfigurovaný propojený server a text požadavku na vzdálený server. OPENQUERY pro přístup k objektům nevyžaduje konvenci názvu čtyř částí.

OPENROWSET

OPENROWSET (Transact-SQL)

Obsahuje všechny informace o připojení potřebné pro přístup ke vzdáleným datům ze zdroje dat OLE DB. Tato metoda je alternativou pro přístup k tabulkám na propojeném serveru a jedná se o jednorázovou metodu připojení a přístupu ke vzdáleným datům pomocí OLE DB. Pro častější odkazy na zdroje dat OLE DB místo toho zvažte použití propojených serverů, PolyBasenebo přímých připojení mezi těmito dvěma zdroji dat prostřednictvím nástrojů, jako jsou SQL Server Integration Services (SSIS) nebo vlastní aplikace.

V dotazu použijte OPENROWSET v klauzuli FROM dotazu. Můžete také použít OPENROWSET jako cílovou tabulku pro příkazy INSERT, UPDATEnebo DELETE, pokud to umožňují schopnosti zprostředkovatele OLE DB. I když dotaz může vrátit více sad výsledků, OPENROWSET vrátí pouze první sadu výsledků.

OPENROWSET také podporuje hromadné operace prostřednictvím integrovaného poskytovatele BULK, který umožňuje čtení a vracení dat ze souboru jako sadu řádků.

Další informace OPENROWSET použít explicitně napsaný připojovací řetězec.

SPUSTIT NA ADRESE

EXECUTE (Transact-SQL)

Umožňuje dynamickému spuštění SQL na propojeném serveru. Jedním z parametrů volání EXECUTE je AT, který je navržen tak, aby obešel omezení OPENQUERY a OPENROWSET. EXECUTE (``<query>``) AT [<linked server>] je dynamický SQL, který může vrátit libovolný počet sad výsledků ze vzdáleného serveru.

Doprovodné materiály k dynamickému SQL

Vyhněte se použití dynamických příkazů SQL v aplikacích a omezte oprávnění pro uživatele s přístupem k dynamickým příkazům SQL. Vytváření dotazů ke spuštění prostřednictvím EXECUTE může vytvářet ohrožení zabezpečení webů a aplikací prostřednictvím útoků prostřednictvím injektáže SQL. Další informace naleznete v tématu SQL Injection.

Pokud jde o výkon, otestujte vzdálené dotazy:

  • Ujistěte se, že se na vzdáleném serveru spustí co nejvíce logiky.
  • Odpovídajícím způsobem ověřte indexy v tabulkách indexu vzdáleného serveru pro podporu dotazu.
  • Mějte na paměti, že použití vzdálených dotazů v základu kódu komplikuje správu verzí databázového kódu a údržbu vývojových a testovacích prostředí.

Příklady

A. Provedení předávacího dotazu SELECT pomocí OPENQUERY

Následující příklad používá předávací dotaz SELECT k výběru řádků s OPENQUERY:

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

B. Provedení předávacího dotazu SELECT pomocí OPENROWSET

Následující příklad používá průchozí SELECT dotaz k výběru řádků, které obsahují OPENROWSET

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

Nativní klient SQL Serveru (často zkracovaný jako SNAC) byl odebrán z SQL Serveru 2022 (16.x) a SQL Server Management Studio 19 (SSMS). Pro nový vývoj se nedoporučuje zprostředkovatele SQL Server Native Client OLE DB (SQLNCLI nebo SQLNCLI11) ani starší verze zprostředkovatele Microsoft OLE DB pro SQL Server (SQLOLEDB). Přejděte na nový ovladač Microsoft OLE DB (MSOLEDBSQL) pro SQL Server do budoucna.

C. Spuštění předávacího dotazu SELECT pomocí příkazu EXECUTE AT

Následující příklad používá průchozí SELECT dotaz k výběru řádků, které obsahují EXECUTE ... AT

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

D. Provádění více příkazů SELECT

Následující příklad používá přímý SELECT dotaz a získává více sad výsledků.

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

E. Provedení příkazu SELECT a předání dvou argumentů

Následující příklad používá předávací SELECT se dvěma argumenty.

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

F. Provedení příkazu SELECT a předání dvou argumentů pomocí proměnných

Následující příklad používá průchozí SELECT se dvěma argumenty pomocí proměnných.

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. Spouštění příkazů DDL pomocí příkazu EXECUTE pomocí propojených serverů

Následující příklad používá příkaz DDL na propojeném serveru.

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

Po dokončení testování vyčistěte vytvořené objekty.

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

Další příklady

Další příklady, které ukazují použití INSERT...SELECT * FROM OPENROWSET(BULK...), najdete v následujících tématech:

Viz také