Подключение базы данных InterBase к MS SQL серверу
-
Установите IBProvider на сервер с MSSQL.
-
Запустите "SQL Server Enterprise Manager".
-
Подключитесь к серверу MSSQL, к которому будет подключена база данных InterBase.
-
Перейдите на элемент дерева "Sequrity\Linked Servers".

-
Выполните пункт меню "New Linked Server".
-
Заполните поля:
| Linked Server |
Имя связанного сервера, которое будет использоваться в тексте SQL запросов.
|
| Provider Name |
LCPI OLE DB Provider for InterBase [v2] |
| Data Source |
Полный путь к базе данных InterBase.
|
| Provider String |
Строка подключения к базе данных. Обязательные параметры:
|

-
Нажмите кнопку "Provider Options". Отметьте элементы
- Dynamic Parameters
- Allow InProcess
Закройте диалог, нажав "OK".
-
Перейдите на вкладку "Server Options". Отметьте элементы
- Data Access
- RPC
- RPC Out
- Use Remote Collation
RPC метки указывают, что провайдер поддерживает вызов хранимых процедур. Проверьте, что в строке подключения вы не забыли указать " support_odbc_query=true".
-
Закройте диалог "Linked Server Properties - New Linked Server", нажав "OK".
Если вы правильно заполнили параметры подключения, то вы можете просмотреть таблицы и виды(views) в подключенной базе данных.

Выполнение запросов к базе данных из "SQL Query Analyzer"
Запустите "SQL Query Analyzer" и подключитесь к MSSQL серверу, на котором вы зарегистрировали связанный сервер InterBase.
Запрос на выборку данных
begin distributed transaction;
select * from IB_EMPL...EMPLOYEE;
commit;
Параметризованный запрос на выборку данных
begin distributed transaction;
declare @first_name as varchar(32);
set @first_name='Scott';
select * from IB_EMPL...EMPLOYEE empl where empl.FIRST_NAME=@first_name;
commit;
Модификация данных
При выполнении SQL-запросов INSERT, UPDATE и DELETE, MSSQL пытается стартовать вложенную транзакцию. Если транзакция уже активна, то провайдер вернет ошибку. Поэтому, перед выполнением таких запросов нужно выполнить команду "SET XACT_ABORT ON", или вообще отказаться от явного управления транзакциями - определив в строке подключения " auto_commit=true".
Вставка нового ряда
set xact_abort on;
begin distributed transaction;
insert into IB_EMPL...COUNTRY (COUNTRY,CURRENCY) values ('Mars','Snickers');
commit transaction;
Изменение ряда
set xact_abort on;
begin distributed transaction;
declare @country varchar(32);
set @country='Mars';
update IB_EMPL...COUNTRY set CURRENCY='Beer' where COUNTRY=@country
commit;
Удаление ряда
set xact_abort on;
begin distributed transaction;
declare @country varchar(32);
set @country='Mars';
delete from IB_EMPL...COUNTRY where COUNTRY=@country
commit;
Вызов хранимой процедуры
Внимание. MS SQL для вызова хранимых процедур всегда использует квотированные имена. Используйте gfix для перевода базы данных employee.gdb в третий диалект.
Получение результата работы хранимой процедуры в виде множества ( odbc_call_sp=0)
begin distributed transaction;
declare @dept_head char(3);
set @dept_head='100';
exec IB_EMPL...SUB_TOT_BUDGET @dept_head
{call IB_EMPL...SUB_TOT_BUDGET(@dept_head)};
commit;
Получение результата работы хранимой процедуры через OUT-параметры. Использовался отдельный linked-server IB_EMPL_1, у которого установлен параметр odbc_call_sp=1
begin distributed transaction;
declare @dept_head char(3);
declare @tot_b numeric(15,2);
declare @avg_b numeric(15,2);
declare @min_b numeric(15,2);
declare @max_b numeric(15,2);
set @dept_head='100';
exec IB_EMPL_1...SUB_TOT_BUDGET @dept_head,@tot_b output,@avg_b output,@min_b output, @max_b output
print 'tot_b='+convert(varchar(32),@tot_b);
print 'avg_b='+convert(varchar(32),@avg_b);
print 'min_b='+convert(varchar(32),@min_b);
print 'max_b='+convert(varchar(32),@max_b);
{call IB_EMPL_1...SUB_TOT_BUDGET(@dept_head,@tot_b output,@avg_b output,@min_b output, @max_b output)};
print 'tot_b='+convert(varchar(32),@tot_b);
print 'avg_b='+convert(varchar(32),@avg_b);
print 'min_b='+convert(varchar(32),@min_b);
print 'max_b='+convert(varchar(32),@max_b);
commit;
На заметку. При использовании IBProvider v3, вы можете использовать автоматическое определение способа получения результатов хранимой процедуры. Для этого нужно установить odbc_call_sp=2.
Выполнение запросов к связанному серверу через ADO
Выполнение запросов из "SQL Query Analyzer" если и представляет какой-либо интерес, то только из разряда теоретических. Реальную пользу можно получить только, если мы сможем работать с данными InterBase через MSSQL из реальных приложений.
Для проведения экспериментов мы использовали компоненты ADO и Windows Script Host. И выяснили следующее:
-
Не удалось выполнить запрос к хранимой процедуре с использованием параметров в тексте запроса. Значения IN-параметров нужно подставлять прямо в текст.
-
Как следствие предыдущего пункта - единственным способом получения результатов из хранимой процедуры является результирующее множество ( odbc_call_sp=0). То есть хранимая процедура должна иметь ключевой слово 'SUSPEND'.
|