Udostępnij za pośrednictwem


Porównanie opcji zdalnego wykonywania zapytań

W programie SQL Server istnieją trzy sposoby zdalnego wykonywania zapytania:

  • OPENQUERY
  • OPENROWSET
  • EXECUTE AT

W tym artykule opisano te trzy metody.

OPENQUERY

OPENQUERY (Transact-SQL)

Wykonuje określone zapytanie przepustowe na określonym powiązanym serwerze. Ten serwer jest źródłem danych OLE DB. W zapytaniu użyj OPENQUERY w FROM tak, jakby była to nazwa tabeli. Możesz również odwołać się do OPENQUERY jako tabeli docelowej instrukcji INSERT, UPDATElub DELETE. Podlega to możliwościom dostawcy OLE DB. Chociaż zapytanie może zwracać wiele zestawów wyników, OPENQUERY zwraca tylko pierwszy zestaw wyników.

OPENQUERY wymaga wstępnie dodanego i skonfigurowanego serwera połączonego oraz tekstu żądania do serwera zdalnego. OPENQUERY nie wymaga czteroczęściowej konwencji nazewniczej do dostępu do obiektów.

OPENROWSET

OPENROWSET (Transact-SQL)

Zawiera wszystkie informacje o połączeniu wymagane do uzyskiwania dostępu do danych zdalnych ze źródła danych OLE DB. Ta metoda jest alternatywą dla uzyskiwania dostępu do tabel na serwerze połączonym i jest jednorazową metodą ad hoc łączenia się i uzyskiwania dostępu do danych zdalnych przy użyciu OLE DB. W przypadku częstszych odwołań do źródeł danych OLE DB rozważ użycie serwerów połączonych , PolyBaselub bezpośrednich połączeń między dwoma źródłami danych za pośrednictwem narzędzi, takich jak usług SQL Server Integration Services (SSIS) lub aplikacji niestandardowych.

W zapytaniu użyj OPENROWSET w klauzuli FROM zapytania. Można również użyć OPENROWSET jako tabeli docelowej w instrukcji INSERT, UPDATElub DELETE, o ile na to pozwalają możliwości dostawcy OLE DB. Chociaż zapytanie może zwrócić wiele zestawów wyników, OPENROWSET zwraca tylko pierwszy zestaw wyników.

OPENROWSET obsługuje również operacje zbiorcze za pośrednictwem wbudowanego dostawcy BULK, który umożliwia odczytywanie i zwracanie danych z pliku jako zestawu wierszy.

Aby uzyskać dodatkowe informacje, OPENROWSET użyć jawnie zapisanych parametrów połączenia.

WYKONAJ AT

WYKONAJ (Transact-SQL)

Umożliwia dynamiczne uruchamianie bazy danych SQL na połączonym serwerze. Jednym z parametrów wywołania EXECUTE jest AT, który ma na celu obejście ograniczeń OPENQUERY i OPENROWSET. EXECUTE (``<query>``) AT [<linked server>] to dynamiczny kod SQL, który może zwrócić dowolną liczbę zestawów wyników z serwera zdalnego.

Wskazówki dotyczące dynamicznej bazy danych SQL

Unikaj używania dynamicznych poleceń SQL w aplikacjach i ogranicz uprawnienia użytkowników z dostępem do dynamicznych poleceń SQL. Konstruowanie zapytań do wykonania za pośrednictwem EXECUTE może powodować luki w zabezpieczeniach witryn internetowych i aplikacji za pośrednictwem ataków polegających na wstrzyknięciu kodu SQL. Aby uzyskać więcej informacji, zobacz SQL Injection.

Gdy wydajność jest problemem, przetestuj zapytania zdalne:

  • Upewnij się, że na serwerze zdalnym jest wykonywana jak najwięcej logiki
  • Zweryfikuj indeksy w tabelach indeksów na serwerze zdalnym, aby odpowiednio obsługiwać zapytanie.
  • Należy pamiętać, że korzystanie z zapytań zdalnych w bazie kodu komplikuje kontrolę wersji kodu bazy danych i konserwację środowisk programistycznych i testowych

Przykłady

A. Wykonaj zapytanie przekazywane SELECT za pomocą OPENQUERY

W poniższym przykładzie użyto zapytania przekazującego SELECT, aby wybrać wiersze z OPENQUERY:

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

B. Wykonaj przezroczyste zapytanie SELECT za pomocą OPENROWSET

W poniższym przykładzie użyto przekazywanego zapytania SELECT do wyboru wierszy z OPENROWSET

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

SQL Server Native Client (często skracany jako SNAC) został usunięty z SQL Server 2022 (16.x) i SQL Server Management Studio 19 (SSMS). Zarówno dostawca OLE DB klienta natywnego programu SQL Server (SQLNCLI lub SQLNCLI11), jak i starszy dostawca MICROSOFT OLE DB dla programu SQL Server (SQLOLEDB) nie są zalecane w przypadku nowego programowania. Przełącz się na nowy sterownik Microsoft OLE DB (MSOLEDBSQL) dla programu SQL Server na przyszłość.

C. Wykonywanie zapytania przekazującego SELECT przy użyciu EXECUTE AT

W poniższym przykładzie użyto zapytania przesyłowego SELECT, aby wybrać wiersze z EXECUTE ... AT

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

D. Wykonywanie wielu instrukcji SELECT

W poniższym przykładzie użyto zapytania przekazującego SELECT oraz uzyskanie wielu zestawów wyników

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

E. Wykonaj polecenie SELECT i przekaż dwa argumenty

W poniższym przykładzie użyto operacji przelotowej SELECT z dwoma argumentami.

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

F. Wykonaj polecenie SELECT i przekaż dwa argumenty przy użyciu zmiennych

W poniższym przykładzie użyto przekazywania select z dwoma argumentami przy użyciu zmiennych

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. Wykonywanie instrukcji DDL z funkcją EXECUTE przy użyciu serwerów połączonych

W poniższym przykładzie użyto instrukcji DDL na serwerze połączonym

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

Po zakończeniu testowania wyczyść utworzone obiekty

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

Dodatkowe przykłady

Aby uzyskać dodatkowe przykłady pokazujące używanie INSERT...SELECT * FROM OPENROWSET(BULK...), zobacz następujące tematy:

Zobacz też