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
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
, UPDATE
lub 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
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
, UPDATE
lub 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
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:
- Przykłady zbiorczego importowania i eksportowania dokumentów XML (SQL Server)
- zachować wartości tożsamości podczas zbiorczego importowania danych (SQL Server)
- zachować wartości null lub użyć wartości domyślnych podczas importowania zbiorczego (SQL Server)
- używanie pliku formatu do zbiorczego importowania danych (SQL Server)
- Używanie Formatu Znaków do Importowania lub Eksportowania Danych (SQL Server)
- użyć pliku formatu, aby pominąć kolumny tabeli (SQL Server)
- Użyj pliku formatu, aby pominąć pole danych (SQL Server)
- Użyj pliku formatu do mapowania kolumn tabeli na pola w SQL Server (Data-File)
Zobacz też
- DELETE (Transact-SQL)
- FROM (Transact-SQL)
- zbiorcze importowanie i eksportowanie danych (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)
- AKTUALIZACJA (Transact-SQL)
- WHERE (Transact-SQL)