Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В SQL Server существует три способа удаленного выполнения запроса:
OPENQUERYOPENROWSETEXECUTE AT
В этой статье описаны три метода.
OPENQUERY
Выполняет указанный сквозной запрос на указанном связанном сервере. Этот сервер является источником данных OLE DB. В запросе используйте OPENQUERY в FROM, как если бы это было имя таблицы. Вы также можете ссылаться на OPENQUERY в качестве целевой таблицы для инструкции типа INSERT, UPDATEили DELETE. Это зависит от возможностей поставщика OLE DB. Хотя запрос может возвращать несколько результирующих наборов, OPENQUERY возвращает только первую.
OPENQUERY требуется предварительно добавленный и настроенный связанный сервер и текст запроса для удалённого сервера.
OPENQUERY не требует использования четырехчастного имени для доступа к объектам.
OPENROWSET
Включает все сведения о подключении, необходимые для доступа к удаленным данным из источника данных OLE DB. Этот метод является альтернативой доступу к таблицам на связанном сервере и является одноразовым, нерегламентированным методом подключения и доступа к удаленным данным с помощью OLE DB. Для более частых ссылок на источники данных OLE DB вместо этого рассмотрите возможность использования связанных серверов, PolyBaseили прямых подключений между двумя источниками данных с помощью таких средств, как SQL Server Integration Services (SSIS) или пользовательских приложений.
В запросе используйте OPENROWSET в предложении FROM запроса. Вы также можете использовать OPENROWSET в качестве целевой таблицы инструкции INSERT, UPDATEили DELETE, при условии возможностей поставщика OLE DB. Хотя запрос может возвращать несколько результирующих наборов, OPENROWSET возвращает только первую.
OPENROWSET также поддерживает массовые операции через встроенный поставщик BULK, который позволяет считывать и возвращать данные из файла в виде набора строк.
Для получения дополнительных сведений используйте явно заданную строку подключения OPENROWSET.
ВЫПОЛНЕНИЕ AT
Позволяет динамическому SQL выполняться на связанном сервере. Одним из параметров вызова EXECUTE является AT, который предназначен для обхода ограничений OPENQUERY и OPENROWSET.
EXECUTE (``<query>``) AT [<linked server>] — это динамический SQL, который может возвращать любое количество результирующих наборов с удаленного сервера.
Руководство по динамическому SQL
Избегайте использования динамических команд SQL в приложениях и ограничения разрешений для пользователей с доступом к динамическим командам SQL. Создание запросов для выполнения с помощью EXECUTE может создавать уязвимости для веб-сайтов и приложений через атаки с использованием SQL-инъекций. Для получения дополнительной информации см. SQL-инъекция.
Если производительность является проблемой, проверьте удаленные запросы:
- Убедитесь, что на удаленном сервере выполняется максимальное количество логики.
- Проверьте индексы в таблицах индексов удаленного сервера соответствующим образом для поддержки запроса.
- Помните, что использование удаленных запросов в базе кода усложняет управление версиями кода базы данных и обслуживание сред разработки и тестирования.
Примеры
A. Выполнение сквозного запроса SELECT с помощью OPENQUERY
В следующем примере используется сквозной запрос SELECT для выбора строк с OPENQUERY:
SELECT *
FROM OPENQUERY ([linkedserver],
'SELECT * FROM AdventureWorksLT.SalesLT.Customer');
B. Выполнение сквозного запроса SELECT с помощью OPENROWSET
В следующем примере для выбора строк с SELECT используется сквозной запрос OPENROWSET.
SELECT a.*
FROM OPENROWSET('MSOLEDBSQL', [linkedserver],
'SELECT * FROM AdventureWorksLT.SalesLT.Customer') AS a;
нативный клиент SQL Server (часто сокращаемый как SNAC) был удален из SQL Server 2022 (16.x) и SQL Server Management Studio 19 (SSMS). Поставщик OLE DB собственного клиента SQL Server (SQLNCLI или SQLNCLI11) и устаревший поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) не рекомендуется для новой разработки. Перейдите на новый Драйвер Microsoft OLE DB (MSOLEDBSQL) для SQL Server в дальнейшем.
C. Выполнение сквозного запроса SELECT с помощью EXECUTE AT
В следующем примере для выбора строк с SELECT используется сквозной запрос EXECUTE ... AT.
EXECUTE ('SELECT * FROM AdventureWorksLT.SalesLT.Customer') AT [linkedserver]
D. Выполнение нескольких инструкций SELECT
В следующем примере используется сквозной запрос SELECT и получение нескольких результирующих наборов
EXECUTE ('SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.Customer;
SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.CustomerAddress;') AT [linkedserver];
E. Выполнение команды SELECT и передача двух аргументов
В следующем примере используется сквозная SELECT с двумя аргументами
EXECUTE ('SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.Customer
WHERE CustomerID = ? AND LastName = ?', 10, 'Garza') AT [linkedserver];
F. Выполнение команды SELECT и передача двух аргументов с помощью переменных
В следующем примере используется сквозной запрос SELECT с двумя аргументами при помощи переменных.
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. Выполнение инструкций DDL с помощью EXECUTE с помощью связанных серверов
В следующем примере используется инструкция DDL на связанном сервере
EXECUTE (
'USE TempDB
IF OBJECT_ID(''dbo.Table1'') IS NOT NULL
DROP TABLE dbo.Table1
CREATE TABLE dbo.Table1
(
Column1 INT
)' ) AT [linkedserver];
После завершения тестирования очистите созданные объекты
EXECUTE (
'USE TempDB
IF OBJECT_ID(''dbo.Table1'') IS NOT NULL
DROP TABLE dbo.Table1'
) AT [linkedserver];
EXECUTE sp_dropserver 'linkedserver'
Дополнительные примеры
Дополнительные примеры, демонстрирующие использование INSERT...SELECT * FROM OPENROWSET(BULK...), см. в следующих разделах:
- примеры массового импорта и экспорта XML-документов (SQL Server)
- Сохранять значения идентификаторов при массовом импорте данных (SQL Server)
- Сохранить NULL или использовать значения по умолчанию во время массового импорта (SQL Server)
- использовать файл форматирования для массового импорта данных (SQL Server)
- использовать формат символов для импорта или экспорта данных (SQL Server)
- Использовать файл форматирования для пропуска столбца таблицы (SQL Server)
- Использование файла форматирования для пропуска поля данных (SQL Server)
- Используйте файл форматирования для сопоставления столбцов таблицы с полями Data-File (SQL Server)
См. также
- DELETE (Transact-SQL)
- ИЗ (Transact-SQL)
- массовый импорт и экспорт данных (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)
- ОБНОВЛЕНИЕ (Transact-SQL)
- ГДЕ (Transact-SQL)