OPENROWSET (Transact-SQL)
Содержит все необходимые сведения о соединении, которые требуются для доступа к удаленным данным источника данных OLE DB. Это альтернативный метод для доступа к таблицам на связанном сервере и является однократным нерегламентированным методом соединения и удаленного доступа к данным с помощью OLE DB. Вместо этого для более частых ссылок на источники данных OLE DB используйте связанные серверы. Дополнительные сведения см. в разделе Связанные серверы (компонент Database Engine). Функция OPENROWSET может быть использована в предложении FROM запроса так, как если бы она была именем таблицы. Функция OPENROWSET также может быть использована как целевая таблица в инструкциях INSERT, UPDATE или DELETE. Это зависит от возможностей поставщика OLE DB. Несмотря на то, что запрос может возвратить несколько результирующих наборов, функция OPENROWSET возвращает только первый из них.
Функция OPENROWSET также поддерживает массовые операции с помощью встроенного поставщика BULK, позволяющего считывать данные из файла и возвращать их в виде набора строк.
Синтаксические обозначения в Transact-SQL
Синтаксис
OPENROWSET
( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password'
| 'provider_string' }
, { [ catalog. ] [ schema. ] object
| 'query'
}
| BULK 'data_file' ,
{ FORMATFILE = 'format_file_path' [ <bulk_options> ]
| SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB }
} )
<bulk_options> ::=
[ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ , ERRORFILE = 'file_name' ]
[ , FIRSTROW = first_row ]
[ , LASTROW = last_row ]
[ , MAXERRORS = maximum_errors ]
[ , ROWS_PER_BATCH = rows_per_batch ]
[ , ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) [ UNIQUE ]
Аргументы
'provider_name'
Символьная строка, которая представляет понятное имя (или PROGID) поставщика OLE DB, указанное в реестре. Аргумент provider_name не имеет значения по умолчанию.'datasource'
Строковая константа, соответствующая конкретному источнику данных OLE DB. Значение datasource — это свойство DBPROP_INIT_DATASOURCE, которое должно быть передано в интерфейс IDBProperties поставщика для инициализации поставщика. Обычно эта строка содержит имя файла базы данных, имя сервера баз данных или имя, с помощью которого поставщик находит базу или базы данных.'user_id'
Строковая константа, представляющая имя пользователя, передаваемое указанному поставщику OLE DB. Аргумент user_id указывает контекст безопасности для подключения и передается как свойство DBPROP_AUTH_USERID для инициализации поставщика. Аргумент user_id не может быть именем входа Microsoft Windows.'password'
Строковая константа, представляющая пароль пользователя, передаваемый поставщику OLE DB. Аргумент password передается как свойство DBPROP_AUTH_PASSWORD при инициализации поставщика. Аргумент password не может быть паролем Microsoft Windows.'provider_string'
Строковая константа для конкретного поставщика, которая передается как свойство DBPROP_INIT_PROVIDERSTRING для инициализации поставщика OLE DB. Аргумент provider_string обычно инкапсулирует все необходимые сведения для инициализации поставщика. Список ключевых слов, распознаваемых поставщиком OLE DB для собственного клиента SQL Server, см. в разделе Свойства инициализации и авторизации.catalog
Имя каталога или базы данных, в котором хранится указанный объект.schema
Имя схемы или владелец указанного объекта.object
Имя объекта, уникальным образом идентифицирующее объект, с которым производится взаимодействие.'query'
Строковая константа, посылаемая поставщику и исполняемая им. Локальный экземпляр SQL Server не обрабатывает этот запрос, но обрабатывает результаты запроса, возвращаемые поставщиком, это так называемый транзитный запрос. Передаваемые запросы полезны при использовании поставщиков, которые не предоставляют свои табличные данные через таблицы имен, а только через командный язык. Передаваемые запросы поддерживаются на удаленном сервере настолько, насколько поставщик запросов поддерживает объект OLE DB Command и его обязательные интерфейсы. Дополнительные сведения см. в разделе Справочник по собственному клиенту SQL Server (OLE DB).BULK
Использует поставщик больших наборов строк для функции OPENROWSET, чтобы читать данные из файла. В SQL Server функция OPENROWSET может считывать данные из файла без их загрузки в целевую таблицу. Это позволяет использовать функцию OPENROWSET совместно с обычной инструкцией SELECT.Аргументы параметра BULK позволяют полностью управлять началом и концом считывания данных, отладку ошибок и способ обработки полученных данных. Например, можно указать, что файл с данными будет считан как однострочный или как набор строк типа varbinary, varchar или nvarchar в один столбец. Поведение по умолчанию описано в следующем далее описании аргументов.
Дополнительные сведения об использовании параметра BULK см. в подразделе «Примечания» далее в этом разделе. Дополнительные сведения о разрешениях, необходимых параметру BULK, см. в подразделе «Разрешения» далее в этом разделе.
Примечание Функция OPENROWSET (BULK ...) не оптимизирует ведение журнала при использовании ее для импорта данных с моделью полного восстановления.
Сведения о подготовке данных к массовому импорту см. в разделе Подготовка данных к массовому экспорту или импорту (SQL Server).
'data_file'
Полный путь к файлу данных, данные из которого копируются в целевую таблицу.FORMATFILE ='format_file_path'
Указывает полный путь к файлу форматирования. SQL Server поддерживает два типа файлов форматирования: XML и отличный от XML.Файл форматирования необходим для определения типов столбцов в результирующем наборе. Единственное исключение — случай, когда указаны аргументы SINGLE_CLOB, SINGLE_BLOB или SINGLE_NCLOB, при которых файл форматирования не обязателен.
Дополнительные сведения о файлах форматирования см. в разделе Использование файла форматирования для массового импорта данных (SQL Server).
< bulk_options >
Указывает один или более аргументов для параметра BULK.CODEPAGE = { 'ACP'| 'OEM'| 'RAW'| 'code_page' }
Указывает кодовую страницу данных в файле данных. Аргумент CODEPAGE имеет смысл только в том случае, если данные содержат столбцы типа char, varchar или text с символами, коды которых больше 127 или меньше 32.Примечание Рекомендуется указывать имя параметров сортировки для каждого столбца в файле форматирования.
Значение аргумента CODEPAGE
Описание
ACP
Преобразует столбцы с типами данных char, varchar или text из кодировки ANSI/Microsoft Windows с кодовой страницей (ISO 1252) в кодовую страницу SQL Server.
OEM (по умолчанию)
Преобразует столбцы с типами данных char, varchar или text из системной кодовой страницы OEM в кодовую страницу SQL Server.
RAW
Преобразование из одной кодовой страницы в другую не выполняется. Это наиболее быстрый параметр.
code_page
Показывает исходную кодовую страницу, в которой представлены символы в файле данных, например 850.
Важно! SQL Server не поддерживает кодовую страницу 65001 (кодировка UTF-8).
ERRORFILE ='file_name'
Указывает файл, используемый для сбора строк, которые имеют ошибки форматирования и не могут быть преобразованы в набор строк OLE DB. Эти строки без изменений копируются из файла данных в файл ошибок.Файл ошибок создается в начале выполнения команды. Если он уже существует, возникнет ошибка. Дополнительно создается управляющий файл с расширением ERROR.txt. Этот файл ссылается на каждую строку в файле ошибок и позволяет провести их диагностику. После исправления ошибок данные могут быть загружены.
FIRSTROW =first_row
Указывает номер первой строки для загрузки. Значение по умолчанию — 1. Значение по умолчанию — первая строка указанного файла данных. Номера строк определяются с помощью подсчета признаков конца строки. Значения аргумента FIRSTROW начинаются с 1.LASTROW =last_row
Указывает номер последней строки для загрузки. Значение по умолчанию равно 0. Оно указывает на последнюю строку в используемом файле данных.MAXERRORS =maximum_errors
Указывает максимальное количество синтаксических ошибок или ошибок форматирования строк, указанное в файле форматирования, которое может произойти до того, как функция OPENROWSET сформирует исключение. Пока значение MAXERRORS не достигнуто, функция OPENROWSET не учитывает все ошибочные строки, не загружая их, и считает каждую ошибочную строку за одну ошибку.Значение по умолчанию для аргумента maximum_errors равно 10.
Примечание Аргумент MAX_ERRORS не применяет ограничения CHECK или преобразования типов money и bigint.
ROWS_PER_BATCH =rows_per_batch
Указывает примерное количество строк данных в файле данных. Значение должно быть того же порядка, что и реальное количество строк.Функция OPENROWSET всегда импортирует файл данных в одном пакете. Однако, если установить аргумент rows_per_batch в значение > 0, обработчик запросов будет использовать значение аргумента rows_per_batch в качестве указания для выделения ресурсов в плане запроса.
По умолчанию значение аргумента ROWS_PER_BATCH неизвестно. Указание аргумента ROWS_PER_BATCH = 0 равносильно опусканию аргумента ROWS_PER_BATCH.
ORDER ( { column [ ASC | DESC ] } [ ,... n ] [ UNIQUE ] )
Необязательное указание; задает, каким образом отсортированы данные в файле. По умолчанию массовая операция считает, что файл данных не упорядочен. Производительность можно повысить, если оптимизатор запросов сможет использовать заданный порядок для создания более эффективного плана запроса. Ниже приведены примеры, в которых указано, когда полезно назначить сортировку.Вставка строк в таблицу с кластеризованным индексом, в которой данные набора строк сортируются по ключу кластеризованного индекса.
Соединение набора строк с другой таблицей с совпадающими столбцами сортировки и соединения.
Статистическая обработка данных набора строк по столбцам сортировки.
Использование набора строк как исходной таблицы в предложении FROM запроса с совпадающими столбцами сортировки и соединения.
Подсказка UNIQUE указывает, что в файле данных нет повторяющихся записей.
Если собственные строки файла данных не отсортированы в соответствии с заданным порядком или если задано указание UNIQUE и присутствуют повторяющиеся ключи, то будет возвращена ошибка.
При использовании ORDER обязательны псевдонимы столбцов. Список псевдонимов столбцов должен ссылаться на производную таблицу, к которой обращается предложение BULK. Имена столбцов, указанных в предложении ORDER, ссылаются на список псевдонимов столбцов. Нельзя указывать столбцы типов больших значений (varchar(max), nvarchar(max), varbinary(max) и xml) и типов больших объектов (text, ntext и image).
SINGLE_BLOB
Возвращает содержимое файла data_file в виде набора строк с одной строкой и одним столбцом типа varbinary(max).Важно! XML-данные рекомендуется импортировать с помощью параметра SINGLE_BLOB, а не SINGLE_CLOB или SINGLE_NCLOB, потому что только параметр SINGLE_BLOB поддерживает все возможные преобразования кодировок в Windows.
SINGLE_CLOB
Считывает файл data_file как ASCII-файл, возвращая содержимое в виде набора строк с одной строкой и одним столбцом типа varchar(max), используя параметры сортировки текущей базы данных.SINGLE_NCLOB
Считывает файл data_file в Юникоде, возвращая содержимое в виде набора строк с одной строкой и одним столбцом типа nvarchar(max), используя параметры сортировки текущей базы данных.
Замечания
Использовать функцию OPENROWSET для доступа к удаленным данным из источников данных OLE DB можно только в случае, если параметр реестра DisallowAdhocAccess явно установлен в значение 0 для указанного поставщика и включен дополнительный параметр конфигурации Ad Hoc Distributed Queries. Если эти параметры не установлены, поведение по умолчанию запрещает нерегламентированный доступ.
При удаленном доступе к источнику данных OLE DB автоматическое делегирование идентификатора имени входа доверительных соединений с сервера, к которому подключен клиент, на запрашиваемый сервер не выполняется. Делегирование проверки подлинности должно быть настроено.
Имена каталога или схемы необходимы, если поставщик OLE DB поддерживает несколько каталогов и схем для указанного источника данных. Значения аргументов catalog и schema можно не указывать, если поставщик OLE DB их не поддерживает. Если поставщик поддерживает только имена схем, необходимо указать двухкомпонентное имя schema**.object . Если поставщик поддерживает только имена каталогов, необходимо указать трехкомпонентное имя в формате catalog.schema.**object. Для передаваемых запросов, использующих поставщик OLE DB для собственного клиента SQL Server, необходимо указать трехкомпонентное имя. Дополнительные сведения см. в разделе Синтаксические обозначения в Transact-SQL (Transact-SQL).
Функция OPENROWSET не принимает переменные в качестве своих аргументов.
Любой вызов функции OPENDATASOURCE, OPENQUERY или OPENROWSET в предложении FROM вычисляется отдельно и независимо от любого вызова этих функций, используемого как назначение при обновлении, даже если в двух таких вызовах будут заданы идентичные аргументы. В частности, условия фильтра или соединения, применяемые к результатам одного из таких вызовов, никак не влияют на результаты другого.
Применение инструкции OPENROWSET с параметром BULK
Следующие усовершенствования Transact-SQL поддерживают функцию OPENROWSET(BULK…).
Предложение FROM, используемое в инструкции SELECT, может вызывать OPENROWSET(BULK…) вместо имени таблицы с полной функциональностью инструкции SELECT.
Функции OPENROWSET с параметром BULK требуется корреляционное имя, также известное как переменная диапазона или псевдоним в предложении FROM. Могут быть указаны псевдонимы столбцов. Если список псевдонимов столбцов не указан, файл форматирования должен содержать имена столбцов. Указание псевдонимов столбцов переопределяет имена столбцов в файле форматирования, такие как:
FROM OPENROWSET(BULK...) AS table_alias
FROM OPENROWSET(BULK...) AS table_alias(column_alias,... n)
Инструкция SELECT…FROM OPENROWSET(BULK...) выполняет запрос данных в файле напрямую без импортирования данных в таблицу. Кроме того, инструкции SELECT…FROM OPENROWSET(BULK…) могут перечислять псевдонимы массовых столбцов, используя файл форматирования для указания имен столбцов и типов данных.
Использование OPENROWSET(BULK...) как исходной таблицы в инструкции INSERT или MERGE выполняет массовый импорт данных из файла в таблицу SQL Server. Дополнительные сведения см. в разделе Массовый импорт данных при помощи инструкции BULK INSERT или OPENROWSET(BULK...) (SQL Server).
При использовании параметра OPENROWSET BULK с инструкцией INSERT предложение BULK поддерживает табличные указания. Кроме обычных табличных указаний вроде TABLOCK, предложение BULK принимает следующие специальные табличные указания: IGNORE_CONSTRAINTS (пропускает только ограничения CHECK и FOREIGN KEY), IGNORE_TRIGGERS, KEEPDEFAULTS и KEEPIDENTITY. Дополнительные сведения см. в разделе Табличные указания (Transact-SQL).
Дополнительные сведения об использования инструкций INSERT...SELECT * FROM OPENROWSET(BULK...) см. в разделе Массовый импорт и экспорт данных (SQL Server). Сведения о том, когда в журнале транзакций регистрируются операции вставки строк, выполняемые при массовом импорте, см. в разделе Предварительные условия для минимального ведения журнала массового импорта данных.
Примечание |
---|
При использовании функции OPENROWSET важно понимать, как SQL Server обрабатывает олицетворение. Дополнительные сведения о вопросах безопасности для см. в разделе Массовый импорт данных при помощи инструкции BULK INSERT или OPENROWSET(BULK...) (SQL Server). |
Массовый импорт данных SQLCHAR, SQLNCHAR или SQLBINARY
Функция OPENROWSET(BULK...) предполагает, что максимальная длина данных SQLCHAR, SQLNCHAR или SQLBINARY не превышает 8 000 байт (если не указано иное). Если импортируемые данные находятся в поле данных LOB, которое содержит любые объекты varchar(max), nvarchar(max) или varbinary(max), превышающие 8000 байт, необходимо использовать XML-файл форматирования, определяющий максимальную длину для поля данных. Чтобы указать максимальную длину, измените файл форматирования и объявите атрибут MAX_LENGTH.
Примечание |
---|
Автоматически сформированный файл форматирования не задает длину или максимальную длину для поля LOB. Однако можно изменить файл форматирования и указать длину или максимальную длину вручную. |
Массовый экспорт или импорт документов SQLXML
Чтобы выполнить массовый экспорт или импорт SQLXML-данных используйте один из следующих типов данных в файле форматирования:
Тип данных |
Эффект |
---|---|
SQLCHAR или SQLVARYCHAR |
Данные отправляются в кодовой странице клиента или кодовой странице, определенной параметрами сортировки. |
SQLNCHAR или SQLNVARCHAR |
Данные отправляются в Юникоде. |
SQLBINARY или SQLVARYBIN |
Данные отправляются без преобразования. |
Разрешения
Разрешения функции OPENROWSET определяются разрешениями имени пользователя, переданного поставщику OLE DB. Чтобы использовать параметр BULK, необходимо разрешение ADMINISTER BULK OPERATIONS.
Примеры
А.Использование функции OPENROWSET с инструкцией SELECT и поставщиком OLE DB для собственного клиента SQL Server
В следующем примере для доступа к таблице HumanResources.Department в базе данных AdventureWorks2012 на удаленном сервере Seattle1 используется поставщик OLE DB для собственного клиента SQL Server. (При использовании SQLNCLI SQL Server будет использовать последнюю версию поставщика OLE DB для собственного клиента SQL Server.) Инструкция SELECT используется для определения возвращаемого набора строк. Строка поставщика содержит ключевые слова Server и Trusted_Connection. Эти ключевые слова распознаются поставщиком OLE DB для собственного клиента SQL Server.
SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;',
'SELECT GroupName, Name, DepartmentID
FROM AdventureWorks2012.HumanResources.Department
ORDER BY GroupName, Name') AS a;
Б.Использование поставщика Microsoft OLE DB для Jet
В следующем примере для доступа к таблице Customers в базе данных Microsoft Access Northwind используется поставщик OLE DB для Jet (Майкрософт).
Примечание |
---|
В этом примере предполагается, что Access установлен. Чтобы выполнить этот пример, необходимо установить базу данных Northwind. |
SELECT CustomerID, CompanyName
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
'admin';'',Customers);
GO
В.Использование функции OPENROWSET и другой таблицы в предложении INNER JOIN
В следующем примере производится выборка всех данных из таблицы Customers базы данных Northwind локального экземпляра SQL Server и из таблицы Orders из базы данных Access Northwind, хранящейся на том же компьютере.
Примечание |
---|
В этом примере предполагается, что 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 ;
GO
Г.Использование функции OPENROWSET для массовой вставки данных из файла в столбец типа varbinary(max)
В следующем примере создается небольшая таблица для демонстрационных целей и вставляются данные из файла с именем Text1.txt, расположенного в корневом каталоге диска C:, в столбец varbinary(max).
USE AdventureWorks2012;
GO
CREATE TABLE myTable(FileName nvarchar(60),
FileType nvarchar(60), Document varbinary(max));
GO
INSERT INTO myTable(FileName, FileType, Document)
SELECT 'Text1.txt' AS FileName,
'.txt' AS FileType,
* FROM OPENROWSET(BULK N'C:\Text1.txt', SINGLE_BLOB) AS Document;
GO
Д.Использование поставщика OPENROWSET BULK с файлом форматирования для получения строк из текстового файла
В следующем примере используется файл форматирования для получения строк, разделенных символами табуляции, из файла values.txt, который содержит следующие данные:
1 Data Item 1
2 Data Item 2
3 Data Item 3
Файл форматирования values.fmt описывает столбцы в файле values.txt:
9.0
2
1 SQLCHAR 0 10 "\t" 1 ID SQL_Latin1_General_Cp437_BIN
2 SQLCHAR 0 40 "\r\n" 2 Description SQL_Latin1_General_Cp437_BIN
Это запрос, который возвращает данные:
SELECT a.* FROM OPENROWSET( BULK 'c:\test\values.txt',
FORMATFILE = 'c:\test\values.fmt') AS a;
Дополнительные примеры
Дополнительные примеры использования инструкций INSERT...SELECT * FROM OPENROWSET(BULK...) см. в следующих разделах.
Примеры массового импорта и экспорта XML-документов (SQL Server)
Сохранение значений идентификаторов при массовом импорте данных (SQL Server)
Использование файла форматирования для массового импорта данных (SQL Server)
Использование символьного формата для импорта и экспорта данных (SQL Server)
Пропуск столбца таблицы с помощью файла форматирования (SQL Server)
Использование файла форматирования для пропуска поля данных (SQL Server)
См. также
Справочник
Предложение FROM (Transact-SQL)
Инструкция INSERT (Transact-SQL)
Функции наборов строк (Transact-SQL)
sp_addlinkedserver (Transact-SQL)
sp_serveroption (Transact-SQL)
Предложение WHERE (Transact-SQL)