Tsql 如何避免在Sybase(T-SQL)中使用游标?
想象一下,您正在更新一些旧式Sybase代码,却遇到了一个光标。存储过程在一个临时表中建立一个结果集,该临时表可以随时返回,只是其中一列不是非常容易被人读取的,它是一个字母数字代码 我们需要做的是找出此代码可能的不同值,调用另一个存储过程来交叉引用这些离散值,然后用新解密的值更新结果集: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
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