5 Stimmen

Navigieren in den Ergebnissen einer gespeicherten Prozedur über einen Cursor mit T-SQL

Aufgrund eines Legacy-Berichtserstellungssystems muss ich einen Cursor verwenden, um die Ergebnismenge aus einer gespeicherten Prozedur zu durchlaufen. Das System erzeugt die Berichtsausgabe, indem es die Daten aus jeder Zeile der Ergebnismenge DRUCKT. Eine Umgestaltung des Berichtssystems würde den Rahmen dieses Problems sprengen.

Soweit ich weiß, erfordert die DECLARE CURSOR-Syntax, dass ihre Quelle eine SELECT-Klausel ist. Die Abfrage, die ich verwenden muss, befindet sich jedoch in einer mehr als 1000 Zeilen langen gespeicherten Prozedur, die dynamisches Sql generiert und ausführt.

Kennt jemand eine Möglichkeit, die Ergebnismenge aus einer gespeicherten Prozedur in einen Cursor zu erhalten?

Ich habe das Offensichtliche versucht:

Declare Cursor c_Data For my_stored_proc @p1='foo', @p2='bar'

Als letzten Ausweg kann ich die gespeicherte Prozedur so modifizieren, dass sie die von ihr erzeugte dynamische SQL zurückgibt, anstatt sie auszuführen, und ich kann diese zurückgegebene SQL in eine andere Zeichenfolge einbetten und diese schließlich ausführen. Etwa so:

Exec my_stored_proc @p1='foo', @p2='bar', @query='' OUTPUT
Set @sql = '
    Declare Cursor c_Data For ' + @query + '
    Open c_Data
    -- etc. - cursor processing loop etc. goes here '
Exec @sql

Haben Sie eine Idee? Kennt jemand eine andere Möglichkeit, die Ergebnismenge eines gespeicherten Prozesses über einen Cursor zu durchsuchen?

Danke.

10voto

lnediger Punkte 1310

Sie können die Ergebnisse des gespeicherten Prozesses in einer temporären Tabelle ablegen und aus dieser Tabelle für Ihren Cursor auswählen.

CREATE TABLE #myResults
(
    Col1 INT,
    Col2 INT
)

INSERT INTO #myResults(Col1,Col2)
EXEC my_Sp

DECLARE sample_cursor CURSOR
FOR
 SELECT
    Col1,
    Col2
 FROM
    #myResults

Eine andere Möglichkeit besteht darin, Ihre gespeicherte Prozedur in eine tabellenwertige Funktion umzuwandeln.

DECLARE sample_cursor CURSOR
FOR
  SELECT
     Col1,
     Col2
  FROM
     dbo.NewFunction('foo', 'bar')

1voto

Remus Rusanu Punkte 280155

Sie verwenden EINFÜGEN ... AUSFÜHREN um das Ergebnis der Prozedur in eine Tabelle zu schieben (kann eine temporäre #Tabelle oder eine @Tabelle-Variable sein), öffnen Sie den Cursor über dieser Tabelle. Der Artikel im Link diskutiert die Probleme, die bei dieser Technik auftreten können: Sie kann nicht verschachtelt werden und erzwingt eine Transaktion um die Prozedur herum.

0voto

Kevin LaBranche Punkte 20730

Sie könnten Ihre SP in einer temporären Tabelle ausführen und dann mit dem Cursor über die temporäre Tabelle iterieren

create table #temp (columns)

insert into #temp exec my_stored_proc ....

Cursorarbeit leisten

Tabelle #temp löschen

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