Сценарии Октелл обращаются к внешним базам компонентом «Запрос в базу данных» — через ADO, OLE или ODBC. Для разовых обращений этого достаточно. Но когда внешняя база используется постоянно, а запросов и хранимых процедур много, каждый раз указывать строку подключения в компоненте неудобно и накладно.
Процедура состоит из двух шагов: зарегистрировать связанный сервер на MS SQL Server и написать нужные запросы на T-SQL. MS SQL Server поддерживает все распространённые форматы хранения данных.
Провайдеры OLE DB
| Провайдер | Для чего | Что указывается источником данных |
|---|---|---|
SQLOLEDB | Серверы SQL Server | Сетевое имя компьютера либо [имя компьютера]\[имя экземпляра] |
MSDAORA | Серверы Oracle | Псевдоним SQL*Net подключаемой базы |
Microsoft.Jet.OLEDB.4.0 | Продукты Access и Jet, а также файлы MS Excel | Полный путь к файлу базы; для Excel дополнительно строка подключения Excel 8.0 |
MSDASQL | Любые продукты через ODBC | DSN источника либо сформированная строка подключения |
Microsoft.ACE.OLEDB.12.0 | Современные файлы Access и Excel | Полный путь к файлу; подходит и для 32-, и для 64-битных версий SQL Server |
Существует ещё несколько провайдеров для узких задач и редко используемых баз.
%windir%\SysWOW64\odbcad32.exe.
Регистрация связанного сервера
Двумя способами: через интерфейс SQL Server Management Studio — ветка «Объекты сервера → Связанные серверы», — либо системными хранимыми процедурами sp_addlinkedserver и sp_addlinkedsrvlogin.
Обращение к таблицам
Таблицы связанного сервера указываются полным именем из четырёх частей, разделённых точками: сервер, база, схема, таблица. Если схема пропущена, используется схема по умолчанию — для тех СУБД, что работают со схемами.
Select * From [ACCESSSAMPLE]...[Table_Users]
Select * From OrclDB..MARY.SALES
Для источников через ODBC применяется openquery, передающий запрос на исполнение самой внешней СУБД:
select * from openquery (MYSQL, 'select * from table_name')
MS Access
Через интерфейс: подключиться к SQL Server с базами Октелл, открыть Security/Linked Servers, зарегистрировать новый связанный сервер. На вкладке General указать название сервера, провайдера Microsoft Jet Ole DB Provider и полный путь к файлу *.MDB. Если СУБД требует аутентификации — задать её на вкладке Security. При верных данных отобразится список таблиц и представлений подключённой базы.
То же самое запросом:
EXEC sp_addlinkedserver 'AccessSample', 'Jet 4.0', 'Microsoft.Jet.OLEDB.4.0',
'C:\Data\db1.mdb', NULL, NULL
EXEC sp_addlinkedsrvlogin 'AccessSample', false, NULL, NULL
Oracle
- Убедитесь, что версия клиентского ПО Oracle на сервере с SQL Server не ниже требуемой провайдером: Oracle Client Software Support File 7.3.3.4.0 или новее и SQL*Net 2.3.3.0.4.
- Зарегистрируйте на этом сервере сетевой псевдоним SQL*Net, ссылающийся на подключаемую базу.
- Выполните
sp_addlinkedserver, указав провайдеромMSDAORA, а источником — созданный псевдоним. - Выполните
sp_addlinkedsrvlogin, чтобы сопоставить логины SQL Server логинам Oracle.
EXEC sp_addlinkedserver 'OrclDB', 'Oracle', 'MSDAORA', 'OracleDB'
MS Excel
Через Microsoft.ACE.OLEDB.12.0
Провайдер подходит и для 32-, и для 64-битных версий SQL Server. Устанавливать удобнее из командной строки с ключом /passive.
Читать данные можно напрямую, без регистрации связанного сервера, — командой OPENROWSET:
select * from OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0; HDR=Yes; Database=C:\Sample.xlsx',
'Select * from [Sheet1$]')
Изменять и добавлять — тоже:
UPDATE OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0; HDR=Yes; Database=C:\Sample.xlsx',
'Select * from [Sheet1$]')
SET id = '123456'
WHERE phone = '...'
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;Database=C:\Sample.xlsx',
'Select * from [Sheet1$]')
SELECT id, phone, comment from sqltable
F15 и подобным образом. Значит, в листе нет строки заголовков или она не распознана: убедитесь, что нужное поле в файле действительно есть и что параметр HDR=Yes уместен.
Количество столбцов не совпадает. При вставке число столбцов в листе Excel и в выборке
select должно быть одинаковым.
OPENROWSET отказывается работать
«Cannot get the column information from OLE DB provider … for linked server "(null)"» — провайдеру нужно разрешить работу в процессе:
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
«SQL Server заблокировал доступ к STATEMENT "OpenRowset/OpenDatasource" компонента "Ad Hoc Distributed Queries"» — компонент отключён настройкой безопасности; включается двумя запросами подряд:
sp_configure 'show advanced options', 1;
reconfigure
sp_configure 'Ad Hoc Distributed Queries', 1;
reconfigure
Excel как связанный сервер
exec sp_addlinkedserver @server = 'XlsLnkSrv',
@srvproduct = 'ACE 12.0',
@provider = 'Microsoft.ACE.OLEDB.12.0',
@datasrc = 'C:\Sample.xlsx',
@provstr = 'Excel 12.0; HDR=Yes'
После обновления обозревателя объектов провайдер появится в ветке «Объекты сервера → Связанные серверы → Поставщики». Читать данные:
select * from openquery (XlsLnkSrv, 'Select * from [Sheet1$]')
Через Microsoft Jet 4.0
Только для 32-битных версий MS SQL Server.
EXEC sp_addlinkedserver 'ExcelSource', 'Jet 4.0', 'Microsoft.Jet.OLEDB.4.0',
'c:\MyData\DistExcl.xls', NULL, 'Excel 8.0'
EXEC sp_addlinkedsrvlogin 'ExcelSource', 'false', NULL, NULL
Select * From [ExcelSource]...[Лист1$]
MySQL
- Установите провайдер ODBC для MySQL нужной разрядности.
- Настройте системный DSN: в «Администраторе источников данных ODBC», вкладка «Системный DSN», добавьте источник с драйвером MySQL. Заполните имя DSN, описание, адрес сервера, логин, пароль и подключаемую базу; проверьте соединение кнопкой Test.
- В SQL Server Management Studio создайте связанный сервер.
| Поле | Значение |
|---|---|
| Связанный сервер | Название, которое будет использоваться в T-SQL-запросах |
| Тип сервера | Другой источник данных |
| Поставщик | Microsoft OLE DB Provider for ODBC Drivers |
| Название продукта | Произвольное, например MySQL |
| Источник данных | Имя созданного DSN |
| Строка поставщика | Driver={MySQL ODBC 5.3 ANSI Driver}; Server=…; Port=3306; Database=…; User=…; Password=…; Option=3; |
На вкладке «Безопасность» выберите «Устанавливать с использованием следующего контекста безопасности» и укажите учётные данные администратора MySQL. На вкладке «Параметры сервера» установите RPC и RPC Out в True.
Firebird
- Установите сервер Firebird — 32-разрядную версию.
- Установите провайдер ODBC для Firebird той же разрядности, что и SQL Server.
- Для 64-битного SQL Server дополнительно нужна 64-разрядная библиотека клиента Firebird
fbclient.dll; распакуйте её в отдельную папку. - Настройте системный DSN с драйвером «Firebird/InterBase(r) driver».
- Создайте связанный сервер: поставщик Microsoft OLE DB Provider for ODBC Drivers, источник данных — имя DSN.
- В ветке «Объекты сервера → Связанные серверы → Поставщики» откройте параметры поставщика
MSDASQLи включите «Только нулевой уровень».
| Поле DSN | Что указать |
|---|---|
| Имя источника данных | Название DSN для подключения |
| База данных | Путь к файлу базы. В отдельных случаях требуется писать его с адресом: 127.0.0.1:C:\FBbase.GDB |
| Клиент | Полный путь к fbclient.dll из шага 3 |
| Пользователь и пароль | Учётные данные подключения |
Запросы к связанному серверу — по имени, указанному при его создании:
select * from FB...Table
UPDATE FB...Table
SET NAME = 'admin'
WHERE ID = 1
INSERT INTO FB...Table (ID, NAME)
VALUES (1000, 'manager')