Поделиться через


OPENROWSET (Transact-SQL)

Применимо к: SQL Server 2016 (13.x) и более поздних версий

OPENROWSET является альтернативой доступу к таблицам на связанном сервере и является одноразовым, нерегламентированным методом подключения и доступа к удаленным данным. Команда OPENROWSET T-SQL включает все сведения о подключении, необходимые для доступа к удаленным данным из внешнего источника данных.

На OPENROWSET функцию можно ссылаться в FROM предложении запроса, как если бы это было имя таблицы. Функцию OPENROWSET можно также ссылаться в качестве целевой INSERTUPDATEтаблицы инструкции или DELETE инструкции, в зависимости от возможностей поставщика данных. Несмотря на то, что запрос может возвратить несколько результирующих наборов, функция OPENROWSET возвращает только первый из них.

Подсказка

Для более частых ссылок на внешние источники данных используйте связанные серверы. Дополнительные сведения см. в статье Связанные серверы (ядро СУБД).

OPENROWSET BULK без оператора доступен только в SQL Server. Подробные сведения и ссылки на аналогичные примеры на других платформах:

Соглашения о синтаксисе Transact-SQL

Синтаксис

OPENROWSET синтаксис используется для запроса внешних источников данных:

OPENROWSET
(  'provider_name'
    , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
    , {  [ catalog. ] [ schema. ] object | 'query' }
)

Аргументы

"provider_name"

Символьная строка, представляющая понятное имя (или PROGID) поставщика данных, указанное в реестре. Аргумент provider_name не имеет значения по умолчанию. Примеры имен поставщиков: MSOLEDBSQL, Microsoft.Jet.OLEDB.4.0 или MSDASQL.

"источник данных"

Строковая константа, соответствующая конкретному источнику данных. источник данных — это DBPROP_INIT_DATASOURCE свойство, передаваемое IDBProperties в интерфейс поставщика для инициализации поставщика. Как правило, эта строка содержит имя файла базы данных, имя сервера базы данных или имя, которое поставщик понимает для поиска базы данных или баз данных.

Источником данных может быть путь к файлу C:\SAMPLES\Northwind.mdb' для поставщика Microsoft.Jet.OLEDB.4.0 или строка подключения Server=Seattle1;Trusted_Connection=yes; для поставщика MSOLEDBSQL.

"user_id"

Строковая константа, которая является именем пользователя, переданного указанному поставщику данных. user_id указывает контекст безопасности подключения и передается в качестве DBPROP_AUTH_USERID свойства для инициализации поставщика. user_id не может быть именем входа в Microsoft Windows.

Пароль

Строковая константа, которая является паролем пользователя, передаваемой поставщику данных. пароль передается в качестве DBPROP_AUTH_PASSWORD свойства при инициализации поставщика. пароль не может быть паролем Microsoft Windows. Например:

SELECT a.* FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\SAMPLES\Northwind.mdb';
    '<user name>';
    '<password>',
    Customers
) AS a;

"provider_string"

Определенный поставщик строка подключения, передаваемый в качестве DBPROP_INIT_PROVIDERSTRING свойства для инициализации поставщика OLE DB. Аргумент provider_string обычно инкапсулирует все необходимые сведения о подключении для инициализации поставщика.

Список ключевых слов, распознаемых поставщиком OLE DB собственного клиента SQL Server, см. в разделе "Свойства инициализации" и "Авторизация" (поставщик OLE DB собственного клиента). Собственный клиент 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 .

SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    Department
) AS d;

[ каталог. ] [ схема. Объект ]

Удаленная таблица или представление, содержащие данные, которые должны быть прочитаны OPENROWSET. Это может быть объект с именем из трех частей со следующими компонентами:

  • каталог (необязательно) — имя каталога или базы данных, в которых хранится указанный объект.
  • схема (необязательно) — имя схемы или владелец указанного объекта.
  • объект — имя объекта, уникальным образом идентифицирующее объект, с которым производится взаимодействие.
SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    AdventureWorks2022.HumanResources.Department
) AS d;

"query"

Строковая константа, отправленная поставщиком и выполняемая поставщиком. Локальный экземпляр SQL Server не обрабатывает этот запрос, но обрабатывает результаты запроса, возвращаемые поставщиком, сквозным запросом. Сквозные запросы полезны, если они используются для поставщиков, которые не предоставляют доступ к табличным данным с помощью имен таблиц, но только с помощью языка команд. Передаваемые запросы поддерживаются на удаленном сервере настолько, насколько поставщик запросов поддерживает объект OLE DB Command и его обязательные интерфейсы.

Дополнительные сведения см. в интерфейсах SQL Server Native Client (OLE DB).

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT TOP 10 GroupName, Name FROM AdventureWorks2022.HumanResources.Department'
) AS a;

Замечания

Функцию OPENROWSET можно использовать для доступа к удаленным данным из источников OLE DB только в том случае, если параметр реестра DisallowAdhocAccess явно содержит значение 0 для указанного поставщика, а также если включен расширенный параметр конфигурации Ad Hoc Distributed Queries. Если эти параметры не заданы, поведение по умолчанию не разрешает нерегламентированный доступ.

При доступе к удаленным источникам данных OLE DB удостоверение входа доверенных подключений не будет автоматически делегировано с сервера, на котором клиент подключен к серверу, который запрашивается. Делегирование проверки подлинности должно быть настроено.

Имена каталогов и схем требуются, если поставщик данных поддерживает несколько каталогов и схем в указанном источнике данных. Значения и catalogschema могут быть опущены, если поставщик данных не поддерживает их. Если поставщик поддерживает только имена схем, необходимо указать двух частей формы schema.object . Если поставщик поддерживает только имена каталогов, необходимо указать трехкомпонентное имя формы catalog.schema.object . Дополнительные сведения см . в соглашениях о синтаксисе Transact-SQL.

Для сквозных запросов, использующих поставщик OLE DB собственного клиента SQL Server, требуются три части.

OPENROWSET не принимает переменные для своих аргументов.

Любой вызов функции OPENDATASOURCE, OPENQUERY или OPENROWSET в предложении FROM вычисляется отдельно и независимо от любого вызова этих функций, используемого как назначение при обновлении, даже если в двух таких вызовах будут заданы идентичные аргументы. В частности, условия фильтра или соединения, применяемые к результатам одного из таких вызовов, никак не влияют на результаты другого.

Разрешения

OPENROWSET разрешения определяются разрешениями имени пользователя, передаваемого поставщику данных.

Примеры

В этом разделе приведены общие примеры использования OPENROWSET.

Примечание.

Примеры использования INSERT...SELECT * FROM OPENROWSET(BULK...)см. в статье OPENROWSET BULK (Transact-SQL).

Собственный клиент 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 .

А. Использование OPENROWSET с select и поставщиком OLE DB собственного клиента SQL Server

В следующем примере поставщик OLE DB собственного клиента SQL Server используется для доступа к HumanResources.Department таблице в AdventureWorks2022 базе данных на удаленном сервере Seattle1. (Используйте MSOLEDBSQL для современного поставщика данных OLE DB Microsoft SQL Server, заменяющего SQLNCLI.) Инструкция SELECT используется для определения возвращаемого набора строк. Строка поставщика содержит ключевые слова Server и Trusted_Connection. Эти ключевые слова распознаются поставщиком OLE DB собственного клиента SQL Server.

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL', 'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT GroupName, Name, DepartmentID
         FROM AdventureWorks2022.HumanResources.Department
         ORDER BY GroupName, Name'
) AS a;

В. Использование поставщика Microsoft OLE DB для Jet

Следующий пример обращается к Customers таблице в базе данных Microsoft Access Northwind с помощью поставщика Microsoft OLE DB для Jet.

Примечание.

В этом примере предполагается, что Microsoft Access установлен. Чтобы запустить этот пример, необходимо установить Northwind базу данных.

SELECT CustomerID, CompanyName
FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
    'admin';'',
    Customers
);

В. Использование OPENROWSET и другой таблицы в INNER JOIN

В следующем примере выбираются все данные из таблицы из Customers локального экземпляра базы данных SQL Server Northwind и из Orders таблицы из базы данных Microsoft Access Northwind , хранящейся на одном компьютере.

Примечание.

В этом примере предполагается, что Microsoft Access установлен. Чтобы запустить этот пример, необходимо установить Northwind базу данных.

USE Northwind;
GO

SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c
INNER JOIN OPENROWSET(
        'Microsoft.Jet.OLEDB.4.0',
        'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'',
        Orders) AS o
    ON c.CustomerID = o.CustomerID;