如何避免在Sybase(T-SQL)中使用游标?
时间:2020-03-05 18:40:22 来源:igfitidea点击:
想象一下,我们正在更新一些旧的Sybase代码并遇到了一个游标。该存储过程在#temporary表中建立了一个结果集,该表可以随时返回,但其中的一列不是人类可读的,而是字母数字代码。
我们需要做的是找出该代码的可能不同值,调用另一个存储过程以交叉引用这些离散值,然后使用新解密的值更新结果集:
declare c_lookup_codes for select distinct lookup_code from #workinprogress while(1=1) begin fetch c_lookup_codes into @lookup_code if @@sqlstatus<>0 begin break end exec proc_code_xref @lookup_code @xref_code OUTPUT update #workinprogress set xref = @xref_code where lookup_code = @lookup_code end
现在,尽管这可能使某些人感到沮丧,但它确实起作用。我的问题是,如何最好避免这种事情?
_NB:就本示例而言,我们还可以想象结果集在500k行的范围内,并且有100个不同的look_up_code值,最后,不可能有一个表,其中的xref值为proc_code_xref中的逻辑太不可思议了。
解决方案
回答
除非我们愿意在外部参照过程中复制代码,否则无法避免使用游标。
回答
如果要取出游标,则必须具有XRef表。假设我们知道100个不同的查找值(并且它们是静态的),则可以简单地通过调用proc_code_xref 100次并将结果插入表中来生成一个查找值
回答
他们说,如果我们必须使用游标,那么我们一定做错了;-)这是没有游标的解决方案:
declare @lookup_code char(8) select distinct lookup_code into #lookup_codes from #workinprogress while 1=1 begin select @lookup_code = lookup_code from #lookup_codes if @@rowcount = 0 break exec proc_code_xref @lookup_code @xref_code OUTPUT delete #lookup_codes where lookup_code = @lookup_code end