Войти

Показать полную графическую версию : Вставка в линкованный сервер


rivera
14-05-2011, 11:36
День добрый.

Есть сервер А
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Windows NT 5.2 <X64> (Build 3790: Service Pack 2)


к нему подключен линкованный сервер (СУБД ORACLE) с именем RS (remote server)
назовем сервер Б


определено представление (view) на сервера А
create view [VIEW] as
SELECT [Column] FROM OPENQUERY(RS, 'SELECT * FROM Exchange.To_EXEC')

запрос с сервера А
insert into [VIEW] (Column)
values ('UPDATE Exchange.HDR_TABLE SET CHECK_DATE = sysdate WHERE ExBilId = ''ЗНАЧЕНИЕ'' ')

выдает ошибку


OLE DB provider "OraOLEDB.Oracle" for linked server "RS" returned message "ORA-22816: unsupported feature with RETURNING clause".
Msg 7343, Level 16, State 2, Line 1
The OLE DB provider "OraOLEDB.Oracle" for linked server "RS" could not INSERT INTO table "[OraOLEDB.Oracle]".


Сам селект из удаленной БД работает отлично.
Где он взял оператор RETURNING (который в ошибке)?


что мешает?

(изначально сервер А был
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
Windows NT 5.2 (Build 3790: Service Pack 2)
и на нем все прекрасно работает)



------------------------------добавлено

забавно, если выполнить тот же insert, но без вьюхи
т.е. вместо

insert into [VIEW] (Column)
values ('tro-lo-lo')

вот это

insert OPENQUERY(RS, 'SELECT [Column] FROM Exchange.To_EXEC')
values ('tro-lo-lo')

то выдает другую ошибку

OLE DB provider "OraOLEDB.Oracle" for linked server "RS" returned message "ORA-00936: missing expression".
Msg 7321, Level 16, State 2, Line 1
An error occurred while preparing the query "SELECT [Column] FROM Exchange.To_EXEC" for execution against OLE DB provider "OraOLEDB.Oracle" for linked server "RS".


------------------------------добавлено2

разница в ошибках, зависит от того, указано ли имя колонки в OPENQUERY
т.е.
OPENQUERY(RS, 'SELECT [Column] FROM Exchange.To_EXEC') - ошибка пропущенной части кода (Msg 7321)
OPENQUERY(RS, 'SELECT * FROM Exchange.To_EXEC') - ошибка RETURNING (Msg 7343)

Busla
14-05-2011, 15:10
Возможно, изначально была установлена другая версия поставщика OLE DB?

вставка во вьюхи imho нужна для реализации совместимости старых приложений, а вы похоже, что-то новое из костылей стоите

rivera
26-05-2011, 11:34
ну в принципе да, т.к. изначально был другой widows server
в 2008 был только указанный OLE DB

проблему решили путем удаления и создания вьюх на всех задействованных серверах, с конкретным указанием всех полей.

т.е.
было

create view [VIEW] as
SELECT [Column] FROM OPENQUERY(RS, 'SELECT * FROM Exchange.To_EXEC')

1. изменили целевую вьюху, в которую вставляли To_EXEC
2. изменили вьюху [VIEW]

create view [VIEW] as
SELECT [Column] FROM OPENQUERY(RS, 'SELECT [Column] FROM Exchange.NewTo_EXEC')

пока работает.




© OSzone.net 2001-2012