Tsql 在游标获取循环中插入Sybase表

Tsql 在游标获取循环中插入Sybase表,tsql,sybase,sap-ase,Tsql,Sybase,Sap Ase,我正在编写一个Sybase存储过程,其中一个游标从表中获取记录并将记录插入回表中。令人惊讶的是,我发现回迁看到amd返回记录插入到同一个循环中。在某些情况下,这会导致无限循环,有时循环结束时会插入一些额外的记录。通过查看Sybase文档,我无法找到治愈方法。事务隔离没有帮助,因为我们是在单个事务中操作的。当然,我可以通过在循环中插入一个临时表,然后在循环结束后再插入主表来解决这个问题。 但问题仍然存在:如何将游标从插入到同一个表中的数据中分离出来? 伪代码如下: create table t (

我正在编写一个Sybase存储过程,其中一个游标从表中获取记录并将记录插入回表中。令人惊讶的是,我发现回迁看到amd返回记录插入到同一个循环中。在某些情况下,这会导致无限循环,有时循环结束时会插入一些额外的记录。通过查看Sybase文档,我无法找到治愈方法。事务隔离没有帮助,因为我们是在单个事务中操作的。当然,我可以通过在循环中插入一个临时表,然后在循环结束后再插入主表来解决这个问题。 但问题仍然存在:如何将游标从插入到同一个表中的数据中分离出来? 伪代码如下:

create table t (v int)
go
insert into t(v) values (1)
create procedure p as
begin
 declare @v int
 declare c cursor for select v from t
 begin transaction
 open c
 while 1=1 begin
  fetch c into @v
  if (@@sqlstatus != 0) break
  insert into t (v) values (@v+1)
 end
 close c
 commit
end
go
exec p
go

我也对这种行为感到惊讶。游标只在行上进行迭代,在循环过程中,它们不受更改的影响。缔约国指出:

在allpages锁定表上搜索或定位的更新可能会更改 行的位置;例如,如果它更新 聚集索引。光标不跟踪该行;它仍然存在 位于原始位置下一行之前。 在后续提取返回之前,不允许定位更新 下一排。更新的行可能对光标可见一秒钟 时间,如果行移动到搜索顺序中较后的位置

我的解决方案是插入一个临时表,并在最后将结果复制回来,这也将过程加快了大约10倍

伪代码:

select * into #results from OriginalTable where 1<>1 --< create temp table with same columns
WHILE fetch...
BEGIN
      insert into #results
      select -your-results-here
END
insert into OriginalTable select * from #results
select*into#results from OriginalTable where 11--
您使用的是哪种Sybase产品?