我该如何避免使用光标在Sybase(T-SQL)?
题
想象一下现场,你在更新一些遗留的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
那么现在,虽然这可能会给一些人心悸,它的工作。我的问题是,如何最好将一个避免这种事情?
_NB:对这个例子的目的也可以想象,结果是设置在该地区的500k行,有100个不同的价值观的look_up_code最后,这是不可能有一个表,与外部参照值在作为逻辑proc_code_xref是太神秘._
解决方案
你必须有一个外部参照表,如果你想利用了光标。假设你知道的100查找不同的价值(以及他们是静态),这是简单的生成一个通过调proc_code_xref100倍,并插入成果表
其他提示
除非你愿意重复代码的外部参照proc,有没有办法,以避免使用了光标。
他们说,如果必须使用标,然后,你必须做错了什么事情;-)这里的解决方案,而不光标:
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
不隶属于 StackOverflow