想象一下这个场景,你正在更新一些旧的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值,最后,不可能有一个带有外部参照的表proc_code_xref中的逻辑值太过神秘._
答案 0 :(得分:1)
除非您愿意在xref proc中复制代码,否则无法避免使用游标。
答案 1 :(得分:1)
如果要取出光标,则必须有一个XRef表。假设您知道100个不同的查找值(并且它们是静态的),通过调用proc_code_xref 100次并将结果插入表中来生成一个很简单
答案 2 :(得分:0)
他们说,如果你必须使用光标,那么,你一定做错了;-)这里没有光标的解决方案:
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