2010-12-30 12 views
1

einzuschließen Ich habe eine SELECT-Anweisung, die eine Reihe von Zeilen zurückgibt.SQL Server-Cursor, um den Wert in Select

Aus jeder Zeile muss ich einen Wert von einer Spalte abrufen und an eine Stored Procedure übergeben, um einen Wert zu erhalten, den ich für den Satz von Zeilen selbst liefern müsste.

Zum Beispiel:

DECLARE @col1 int 
DECLARE @col2 int 
DECLARE @col3 varchar(20) 

DECLARE myCursor CURSOR FOR 
SELECT col1, col2, col3 
FROM table1 
WHERE.... 

OPEN myCursor 
FETCH NEXT FROM myCursor 
INTO @col1, @col2 

WHILE @@FETH_STATUS = 0 
BEGIN 
    SET @col3 = EXEC proc_GetCol3_Value @col1, @col2 

    FETCH NEXT FROM myCursor 
    INTO @col1, @col2 
END 

CLOSE myCursor 
DEALLOCATE myCursor 

nun von der Basis, möchte ich die Zeilen zurück, wie durch den ursprünglichen Cursor abgerufen, sowie die von der gespeicherten Prozedur abgerufenen Wert ausgeführt Spalte 3 der Wert zu sein.

Sprich, die Zeilen von den SQL-Cursor zurückgegeben werden:

col1 col2 col3 
    1 5000 
    2 5000 
    3 2500 
    4 2000 

Und was ich brauche, ist, dass alle Spalten die Cursor nach dem Ausführen und den gespeicherten Proc und die Ergebnismenge sollte geliefert wurden:

col1 col2 col3 
    1 5000 APPROVED 
    2 5000 REJECTED 
    3 2500 CANCELLED 
    4 2000 APPROVED 

Alle Ideen willkommen. Vielen Dank.

P.S. Ich weiß, dass eine Menge würde empfehlen, einfach eine JOIN-Anweisung zu verwenden, aber da die gespeicherte Prozedur ziemlich komplex ist, wäre es zu kompliziert, einen Join mit der Cursor-SQL-Anweisung zu machen.

+0

bitte den Titel ändern, da ich eine vage Vorstellung davon, was Titel sollte diese Frage sein. – Batuta

Antwort

1

Wenn Sie die gespeicherte Prozedur proc_GetCol3_Value nicht verwenden, würde ich dringend vorschlagen, den Cursor, den Sie verwenden, zu verwerfen und Ihre gespeicherte Prozedur in eine benutzerdefinierte Funktion umzuwandeln.

Obwohl ich kein Fan von benutzerdefinierten Funktionen bin (aufgrund von Leistungsproblemen), könnte dies ein Fall sein, einen zu verwenden. Sie können am ehesten Ihre gespeicherte Prozedur Code, um eine benutzerdefinierte Funktion migrieren (wir nennen es func_GetCol3_Value), die den Status zurückgibt, und jetzt Ihre Abfrage kann einfach sein:

SELECT col1, col2, func_GetCol3_Value(col1, col2) as col3 
FROM table1 

Je nachdem, wie Grund- oder komplex Ihre gespeicherte Prozedur ist, benötigen Sie möglicherweise nicht einmal eine Funktion, aber wir müssten den Code zuerst sehen, um zu erzählen.

+0

Gute Antwort-Ich stimme zu, dieser Code fragt nach einer UDF verwendet werden ... – Sparky

+0

Vielen Dank dafür. Ich habe den SP in einen Funktionsaufruf platziert und die Funktion aus der SQL-Auswahl aufgerufen. – Batuta

2

Wenn aus irgendeinem Grund nicht auf eine Funktion ändern:

DECLARE @col1 int 
DECLARE @col2 int 
DECLARE @col3 varchar(20) 
DECLARE @Output (col1 int, col2 int, col3 varchar (20)) 

DECLARE myCursor CURSOR FOR 
    SELECT col1, col2, col3 FROM table1 WHERE.... 
OPEN myCursor 
FETCH NEXT FROM myCursor INTO @col1, @col2 
WHILE @@FETH_STATUS = 0 
BEGIN 
    SET @col3 = EXEC proc_GetCol3_Value @col1, @col2 

    INSERT INTO @Output (col1, col2, col3) 
    VALUES @col1, @col2, @col3 

FETCH NEXT FROM myCursor INTO @col1, @col2 
END 
CLOSE myCursor 
DEALLOCATE myCursor 

SELECT col1, col2, col3 from @Output