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

Если вы правильно заполнили параметры подключения, то вы можете просмотреть таблицы и виды(views) в подключенной базе данных.

Запустите "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. И выяснили следующее: