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._

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top