找到符合条件的行时,如果 SQL Anywhere 不能将 UPDATE 或 DELETE 语句完整地传递给远程服务器,则它必须将该语句转换成一个表扫描,该表扫描包含原始 WHERE 子句的尽可能多的部分,后跟指定 WHERE CURRENT
OF cursor-name 的定位 UPDATE 或 DELETE 语句。
例如,如果远程服务器不支持函数 ATAN2:
UPDATE t1
SET a = atan2( b, 10 )
WHERE b > 5;
将被转换为以下内容:
SELECT a,b
FROM t1
WHERE b > 5;
每当找到一行时,SQL Anywhere 都会计算出 a 的新值并执行:
UPDATE t1
SET a = 'new value'
WHERE CURRENT OF CURSOR;
如果 a 已有等于该新值的值,则没有必要执行定位的 UPDATE,因此也不会远程发送定位的 UPDATE。
为了处理需要表扫描的 UPDATE 或 DELETE 语句,远程数据源必须支持执行定位 UPDATE 或 DELETE (WHERE CURRENT OF cursor-name) 的功能。某些数据源不支持此功能。
不能更新临时表
如果需要中间临时表,则不能执行 UPDATE 或 DELETE。这种情况发生在具有 ORDER BY 的查询和某些具有子查询的查询中。