Insert в Informix как linked server

igor_u
Дата: 13.10.2003 14:48:06
Есть прилинкованный Infromix. Пытаюсь выполнить код:

insert into depo42.depo.informix.issue_codes (person_id, security_id, issue_code, mode)   

select 59957, i.security_id, c.code issue_code, case c.is_active when 'Y' then 0 else 9 end into #tmp1
from v_codes c
join v_sbr s on c.object_id=s.security_id
join depo42.depo.informix.issues i on s.ndc_code=i.security_code
where c.code_type_mn='RTS'


Получаю ошибку:
OLE DB provider 'MSDASQL' reported an error. The provider reported an unexpected catastrophic failure.
[OLE/DB provider returned message: Query cannot be updated because the FROM clause is not a single simple table name.]
OLE DB error trace [OLE/DB Provider 'MSDASQL' IRowsetChange::InsertRow returned 0x8000ffff: The provider reported an unexpected catastrophic failure.].

Ладно, пробуем тогда через временную таблицу:
  select 59957 person_id, i.security_id, c.code issue_code, case c.is_active when 'Y' then 0 else 9 end mode into #tmp1

from v_codes c
join v_sbr s on c.object_id=s.security_id
join depo42.depo.informix.issues i on s.ndc_code=i.security_code
where c.code_type_mn='RTS'

insert into depo42.depo.informix.issue_codes (person_id, security_id, issue_code, mode) select person_id, security_id, issue_code, mode from #tmp1

Эффект тот же.

Ладно, пробуем так, вообще без FROM:
insert into depo42.depo.informix.issue_codes (person_id, security_id, issue_code, mode) values (59957,449,'AFLT',0)

Та же фигня.

У кого-нибудь есть какие-нибудь идеи, как это побороть? Поиск в форуме и MSDN ничего не дал.
Заранее спасибо.
Glory
Дата: 13.10.2003 15:41:45
Интересно. А так
insert openquery(depo42, 'select person_id, security_id, issue_code, mode from depo.informix.issue_codes')

select 59957,449,'AFLT',0
igor_u
Дата: 13.10.2003 16:59:07
Так еще интереснее:

Server: Msg 7399, Level 16, State 1, Line 1
OLE DB provider 'MSDASQL' reported an error.
[OLE/DB provider returned message: [Informix][Informix ODBC Driver][Informix]Unspecified System Error = -201.]
OLE DB error trace [OLE/DB Provider 'MSDASQL' ICommandPrepare::Prepare returned 0x80004005: ].

Согласно справочнику ошибок Informix, ошибка -201 - это Syntax error :).

Кривизна ODBC драйвера?
Glory
Дата: 13.10.2003 17:05:03
1. Я просто не знаю синтаксиса Informix. Такой запрос работает ?

select * from openquery(depo42, 'select person_id, security_id, issue_code, mode from depo.informix.issue_codes') AS a


2. Первичный ключ у depo.informix.issue_codes есть ?

3. Вы добавляете все поля, которые есть в depo.informix.issue_codes или только часть ?
igor_u
Дата: 13.10.2003 17:22:41
автор писал:
1. Я просто не знаю синтаксиса Informix. Такой запрос работает ?

select * from openquery(depo42, 'select person_id, security_id, issue_code, mode from depo.informix.issue_codes') AS a


Нет, та же ошибка. Такой работает:
select * from depo42.depo.informix.issue_codes


автор писал:
2. Первичный ключ у depo.informix.issue_codes есть ?

person_id, security_id

автор писал:
3. Вы добавляете все поля, которые есть в depo.informix.issue_codes или только часть ?
И так и так пробовал. Ничего не меняется. Но в любом случае добавляю все NOT NULL (кроме счетчика).
Glory
Дата: 13.10.2003 17:29:56
Нет, та же ошибка. Такой работает:
Я же говорю, чтоне знаю синтаксиса Informix. В openquery( в кавычках должен быть синтаксически верный Informix-ий(!!!) запрос
igor_u
Дата: 13.10.2003 18:02:22
Great thanks. Так работает:

insert openquery(depo42, 'select person_id, security_id, issue_code, mode from issue_codes')

select 59957 , i.security_id, c.code issue_code, case c.is_active when 'Y' then 0 else 9 end --mode into #tmp1

from v_codes c
join v_sbr s on c.object_id=s.security_id
join depo42.depo.informix.issues i on s.ndc_code=i.security_code
where c.code_type_mn='RTS'


Если не сложно: в чем принципиальная разница между
depo42.depo.informix.issue_codes 
и
openquery(depo42, 'select person_id, security_id, issue_code, mode from issue_codes') 
? Т.е. иными словами, почему все-таки первоначальный вариант не работал?
Glory
Дата: 13.10.2003 18:37:39
Мое лично мнение, что MSSQL умеет полноценно работать с four-part name только если удаленный сервер тоже MSSQL.
Думаю что в вашем конктерном случае оптимизатор пытается построить какой-то лучший с его точки зрения план выполнения, но видно этот план предусматривает какие-то действия которые провайдер(удаленный сервер ?) не поддерживает.

В то время как в openquery всё "тупо" - Executes the specified pass-through query on the given linked server, which is an OLE DB data source.
Т.е. данные ушли на удаленный сервер именно как данные и все. Пускай удаленный сервер сам решает, что и как он с ними будет делать.
злой шаман
Дата: 13.10.2003 18:48:50
На самом деле с другими версиями MSSQL тоже глюки бывают. У меня на связке 7.0-2K апдэйты локальной таблицы данными с другого сервера подглючивали, пришлось тоже делать через openquery.
igor_u
Дата: 14.10.2003 10:37:06
Понятно. Большое спасибо всем участникам, особенно Glory.