【问题标题】:How do I avoid using cursors in Sybase (T-SQL)?如何避免在 Sybase (T-SQL) 中使用游标?
【发布时间】:2010-09-06 02:05:51
【问题描述】:

想象一下场景,您正在更新一些旧版 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 行的区域内,并且 look_up_code 有 100 个不同的值,最后,不可能有一个带有外部参照的表proc_code_xref 中的逻辑太神秘了。_

【问题讨论】:

    标签: tsql sybase cursors


    【解决方案1】:

    除非您愿意复制外部参照过程中的代码,否则无法避免使用游标。

    【讨论】:

      【解决方案2】:

      如果你想取出光标,你必须有一个外部参照表。假设您知道 100 个不同的查找值(并且它们是静态的),很容易通过调用 proc_code_xref 100 次并将结果插入到表中来生成一个

      【讨论】:

        【解决方案3】:

        他们说,如果你必须使用光标,那么,你一定做错了什么;-) 这里是没有光标的解决方案:

        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
        

        【讨论】:

          猜你喜欢
          • 2014-12-22
          • 1970-01-01
          • 2011-12-06
          • 2017-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-08
          • 2016-07-09
          相关资源
          最近更新 更多