2 Stimmen

Wie vermeide ich die Verwendung von Cursors in Sybase (T-SQL)?

Stellen Sie sich vor, Sie aktualisieren einen Sybase-Legacy-Code und stoßen auf einen Cursor. Die gespeicherte Prozedur baut eine Ergebnismenge in einer #temporären Tabelle auf, die bereit ist, zurückgegeben zu werden, außer dass eine der Spalten nicht sehr gut lesbar ist, es ist ein alphanumerischer Code.

Was wir tun müssen, ist, die möglichen unterschiedlichen Werte dieses Codes herauszufinden, eine andere gespeicherte Prozedur aufzurufen, um einen Querverweis auf diese diskreten Werte herzustellen und dann die Ergebnismenge mit den neu entschlüsselten Werten zu aktualisieren:

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

Das mag zwar bei manchen Leuten Herzklopfen auslösen, aber es funktioniert. Meine Frage ist: Wie kann man so etwas am besten vermeiden?

Für die Zwecke dieses Beispiels können Sie sich auch vorstellen, dass die Ergebnismenge etwa 500k Zeilen umfasst und dass es 100 verschiedene Werte von look_up_code gibt und dass es schließlich nicht möglich ist, eine Tabelle mit den xref-Werten zu haben, da die Logik in proc_code_xref zu undurchsichtig ist.

1voto

Stu Punkte 15215

Wenn Sie nicht bereit sind, den Code in der xref-Prozedur zu duplizieren, gibt es keine Möglichkeit, die Verwendung eines Cursors zu vermeiden.

1voto

David Hayes Punkte 7290

Sie müssen eine XRef-Tabelle haben, wenn Sie den Cursor herausnehmen wollen. Angenommen, Sie kennen die 100 verschiedenen Nachschlagewerte (und dass sie statisch sind), dann ist es einfach, eine zu erzeugen, indem Sie proc_code_xref 100 Mal aufrufen und die Ergebnisse in eine Tabelle einfügen

0voto

B0rG Punkte 1205

Man sagt, wenn man den Cursor benutzen muss, dann muss man etwas falsch gemacht haben ;-) hier ist 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X