Tsql 如何避免在Sybase(T-SQL)中使用游标?

Tsql 如何避免在Sybase(T-SQL)中使用游标?,tsql,sybase,cursors,Tsql,Sybase,Cursors,想象一下,您正在更新一些旧式Sybase代码,却遇到了一个光标。存储过程在一个临时表中建立一个结果集,该临时表可以随时返回,只是其中一列不是非常容易被人读取的,它是一个字母数字代码 我们需要做的是找出此代码可能的不同值,调用另一个存储过程来交叉引用这些离散值,然后用新解密的值更新结果集: declare c_lookup_codes for select distinct lookup_code from #workinprogress while(1=1) begin fetch c

想象一下,您正在更新一些旧式Sybase代码,却遇到了一个光标。存储过程在一个临时表中建立一个结果集,该临时表可以随时返回,只是其中一列不是非常容易被人读取的,它是一个字母数字代码

我们需要做的是找出此代码可能的不同值,调用另一个存储过程来交叉引用这些离散值,然后用新解密的值更新结果集:

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
现在,虽然这可能会让一些人心悸,但它确实有效。我的问题是,怎样才能最好地避免这种事情


_注意:在本例中,您还可以想象结果集在500k行的区域内,有100个不同的查找代码值,最后,由于过程代码外部参照中的逻辑太神秘,因此不可能有一个包含外部参照值的表。\uuuxAE>除非您愿意在外部参照过程中复制代码,否则无法避免使用光标。

如果要取出光标,必须有一个外部参照表。假设您知道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