Wie kann ich vermeiden die Verwendung von cursors in Sybase (T-SQL)?
Frage
Stellen Sie sich die Szene, die Sie aktualisieren einige legacy-Sybase-code und kommen über einen cursor.Die gespeicherte Prozedur erstellt ein Ergebnis-set in einem #temporären Tabelle, die alle bereit zurückgegeben werden, außer, dass eine der Spalten, die nicht so furchtbar menschlich lesbar, es ist ein alphanumerischer code.
Was wir tun müssen, ist herauszufinden, die möglichen unterschiedlichen Werte dieser code eine andere gespeicherte Prozedur aufrufen, um cross-Referenz diese diskreten Werte, und aktualisieren Sie dann das Ergebnis legen Sie mit dem neu entschlüsselt Werte:
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
Nun, während dies einige Leute Herzklopfen, es funktioniert.Meine Frage ist, wie man am besten würde man es vermeiden, diese Art der Sache?
_NB:für die Zwecke dieses Beispiels können Sie sich auch vorstellen, dass die Ergebnismenge in der region 500k Zeilen und, dass es sind 100 verschiedene Werte von look_up_code und schließlich, dass es nicht möglich ist, eine Tabelle mit den xref-Werte in der Logik im proc_code_xref zu arcane._
Lösung
Sie haben ein XRef-Tabelle, wenn Sie wollen, um den cursor.Vorausgesetzt, Sie wissen, die 100 verschiedene lookup-Werte (und das sind Sie statisch) es ist einfach zu erzeugen, indem Sie proc_code_xref 100 mal und einfügen der Ergebnisse in eine Tabelle
Andere Tipps
Wenn Sie bereit sind, duplizieren Sie den code in der xref-proc, es ist keine Möglichkeit zu vermeiden, mit einem cursor.
Sie sagen, dass, wenn Sie müssen, verwenden Sie den cursor, dann müssen Sie etwas falsch gemacht haben ;-) hier die Lösung ohne cursor:
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