cancel
Showing results for 
Search instead for 
Did you mean: 

How to update a local table joined with a proxy table?

VolkerBarth
Contributor
5,637

Frequently I have to use queries of the following kind to update a local table based on values from a proxy table (usually the remote server being a MS SQL Server):

:::SQL
update LocalTable LT
set col = PT.col
from LocalTable LT inner join ProxyTable PT on LT.pk = PT.pk;

AFAIK, these queries are generally not supported and return a SQLCODE -728 ("Update operation attempted on non-updatable remote query").

My usual workaround is to fetch the needed remote values in a local temporary table and join that against the local table, something like

:::SQL
select pk, col into local temporary table TempTable
from ProxyTable
order by pk;

update LocalTable LT
set col = TT.col
from LocalTable LT inner join TempTable TT on LT.pk = TT.pk;

drop table TempTable;

Question:

While that workaround is acceptable, is there a way in v12.0.1 to allow one-step updates with remote tables, i.e. some tuning of server capabilities or the like?

(Note: The udate/delete itself would always modify the local table, not the remote one - the latter often being used with a read-only remote server.)

Accepted Solutions (1)

Accepted Solutions (1)

Former Member

Volker,

I am sorry to tell you that the restriction with performing update/delete operations on a join between a proxy table and a local table is still in place for SA 12.0.1 and will likely remain in place for quite some time. I realize that the restriction only makes sense when it is actually the remote table that is being updated or deleted from; however, for consistency and other less obvious/internal reasons, the restriction is in place regardless of whether it is the local or remote table that is being modified. There are no tweaks you can make to capability bits or options that will allow the restriction to be relaxed. Your approach of using an intermediate temporary table is the correct/recommended approach.

VolkerBarth
Contributor
0 Kudos

Thanks for the clarification - I can easily cope with that limitation:)

Answers (1)

Answers (1)

Former Member
0 Kudos

You may be able to use the MERGE statement like:

:::SQL
MERGE INTO LocalTable USING ProxyTable ON LocalTable.pk = ProxyTable.pk WHEN MATCHED THEN UPDATE WHEN NOT MATCHED THEN SKIP;

http://dcx.sybase.com/index.html#1201/en/dbreference/merge-statement.html

VolkerBarth
Contributor
0 Kudos

I have been very existing about this approach - MERGE is one of the newer statements I don't use too often.

However, unfortunately, this approach seems to fail, too, with a -134 ("MERGE INTO <remote_table> is not supported") error message (tested on Win32 with 12.0.1.3298). Note that - in contrast to the error message - I'm trying to merge into the LocalTable as in Tyson's sample.

As I understand, the particular branches of a MERGE statement's actions are done with ordinary INSERT/UPDATE/DELETE statements - therefore it seems reasonable that MERGE has the same restrictions as the underlying UPDATE statement.

VolkerBarth
Contributor
0 Kudos

Should read "I have been very excited at this approach..."