Дата публикации: 24.06.2003
Обновлено: 26.10.2018

Регистрация и работа со связанным сервером MSSQL 2000.

Создание связанного сервера

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

    Sequrity\Linked Servers

  5. Выполните пункт меню «New Linked Server».
  6. Заполните поля:

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


    Linked Server Properties

  7. Нажмите кнопку «Provider Options». Отметьте элементы:
    • Dynamic Parameters
    • Allow InProcess
    Закройте диалог, нажав «OK».
  8. Перейдите на вкладку «Server Options». Отметьте элементы:
    • Data Access
    • RPC
    • RPC Out
    • Use Remote Collation
    RPC метки указывают, что провайдер поддерживает вызов хранимых процедур. Проверьте, что в строке подключения вы не забыли указать «support_odbc_query=true».
  9. Закройте диалог «Linked Server Properties — New Linked Server», нажав «OK».

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

SQL Server Enterprise Manager

Выполнение запросов к базе данных из «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 [email protected]_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 [email protected];

commit;

Удаление ряда

set xact_abort on;

begin distributed transaction;

declare @country varchar(32);

set @country='Mars';

delete from IB_EMPL...COUNTRY where [email protected];

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’.

Полезные ссылки


Дата публикации: 24.06.2003. Права на материал принадлежат: IBProvider. При перепечатке ссылка на сайт https://www.ibprovider.com/rus обязательна.