Регистрация и работа со связанным сервером MSSQL 2000.
Создание связанного сервера
- Установите 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 Строка подключения к базе данных. Обязательные параметры: - user
- password
- ctype
- truncate_char=false
- support_odbc_query=true
- odbc_call_sp
- Нажмите кнопку «Provider Options». Отметьте элементы:
- Dynamic Parameters
- Allow InProcess
- Перейдите на вкладку «Server Options». Отметьте элементы:
- Data Access
- RPC
- RPC Out
- Use Remote Collation
- Закройте диалог «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;
Вызов хранимой процедуры
Получение результата работы хранимой процедуры в виде множества (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;
Выполнение запросов к связанному серверу через ADO
Выполнение запросов из «SQL Query Analyzer» если и представляет какой-либо интерес, то только из разряда теоретических. Реальную пользу можно получить только, если мы сможем работать с данными InterBase через MSSQL из реальных приложений.
Для проведения экспериментов мы использовали компоненты ADO и Windows Script Host. И выяснили следующее:
- Не удалось выполнить запрос к хранимой процедуре с использованием параметров в тексте запроса. Значения IN-параметров нужно подставлять прямо в текст.
- Как следствие предыдущего пункта — единственным способом получения результатов из хранимой процедуры является результирующее множество (odbc_call_sp=0). То есть хранимая процедура должна иметь ключевой слово ‘SUSPEND’.