Freigeben über


Verwenden des cursor-Datentyps in OUTPUT-Parametern

Mit Transact-SQL gespeicherte Prozeduren können den cursor-Datentyp nur für OUTPUT-Parameter verwenden. Ist der cursor-Datentyp für einen Parameter angegeben, ist sowohl der VARYING- als auch der OUTPUT-Parameter erforderlich. Ist das VARYING-Schlüsselwort für einen Parameter angegeben, muss der Datentyp cursor sein und das OUTPUT-Schlüsselwort angegeben werden.

HinweisHinweis

Der cursor-Datentyp kann nicht durch Datenbank-APIs, wie z. B. OLE DB, ODBC, ADO und DB-Library, an Anwendungsvariablen gebunden werden. Da OUTPUT-Parameter gebunden werden müssen, bevor eine Anwendung eine gespeicherte Prozedur ausführen kann, können gespeicherte Prozeduren mit cursor-OUTPUT-Parametern nicht aus den Datenbank-APIs heraus aufgerufen werden. Diese Prozeduren können von Transact-SQL-Batches, gespeicherten Prozeduren oder Triggern heraus aufgerufen werden, wenn die cursor-OUTPUT-Variable einer lokalen Transact-SQL-cursor-Variablen zugewiesen ist.

Ausgabeparameter vom cursor-Datentyp

Folgende Regeln gelten für Ausgabeparameter vom cursor-Datentyp, wenn die Prozedur ausgeführt wird:

  • Bei einem Vorwärtscursor werden im Resultset des Cursors nur die Zeilen zurückgegeben, die sich am Ende der Ausführung der gespeicherten Prozedur an und hinter der Cursorposition befinden. Beispiel:

    • Ein nicht scrollfähiger Cursor wird in einer Prozedur für ein Resultset namens RS geöffnet, das 100 Zeilen umfasst.

    • Die Prozedur ruft die ersten 5 Zeilen des Resultsets RS ab.

    • Die Prozedur gibt das Resultset an den Aufrufer zurück.

    • Das Resultset RS, das an den Aufrufer zurückgegeben wird, besteht aus den Zeilen 6 bis 100 von RS, und der Cursor im Aufrufer wird vor der ersten Zeile von RS positioniert.

  • Wenn ein Vorwärtscursor beim Abschluss der gespeicherten Prozedur vor der ersten Zeile positioniert ist, wird das gesamte Resultset an den aufrufenden Batch, die aufrufende gespeicherte Prozedur oder den aufrufenden Trigger zurückgegeben. Nach der Rückgabe wird der Cursor vor der ersten Zeile positioniert.

  • Wenn ein Vorwärtscursor beim Abschluss der gespeicherten Prozedur hinter dem Ende der letzten Zeile positioniert ist, wird ein leeres Resultset an den aufrufenden Batch, die aufrufende gespeicherte Prozedur oder den aufrufenden Trigger zurückgegeben.

    HinweisHinweis

    Ein leeres Resultset ist nicht das Gleiche wie ein NULL-Wert.

  • Bei einem scrollfähigen Cursor werden am Ende der Ausführung der gespeicherten Prozedur alle Zeilen im Resultset an den aufrufenden Batch, die aufrufende gespeicherte Prozedur oder den aufrufenden Trigger zurückgegeben. Nach der Rückgabe behält der Cursor die Position des letzten in der Prozedur ausgeführten Abrufs bei.

  • Bei allen Cursortypen wird ein NULL-Wert an den aufrufenden Batch, die aufrufende gespeicherte Prozedur oder den aufrufenden Trigger zurückgegeben, wenn der Cursor geschlossen ist. Dies ist auch dann der Fall, wenn ein Cursor einem Parameter zugewiesen ist, dieser Cursor jedoch nie geöffnet wird.

    HinweisHinweis

    Der geschlossene Status ist nur zum Zeitpunkt der Rückgabe relevant. Beispielsweise ist es zulässig, einen Cursor während eines Teils der Prozedur zu schließen, ihn zu einem späteren Zeitpunkt in der Prozedur wieder zu öffnen und das Resultset dieses Cursors an den aufrufenden Batch, die aufrufende gespeicherte Prozedur oder den aufrufenden Trigger zurückzugeben.

Beispiel

Im folgenden Beispiel wird eine gespeicherte Prozedur mit einem Ausgabeparameter @currency\_cursor im cursor-Datentyp erstellt. Die gespeicherte Prozedur wird anschließend in einem Batch aufgerufen.

Zuerst wird die Prozedur erstellt, die einen Cursor für die Currency-Tabelle deklariert und dann öffnet.

USE AdventureWorks;
GO
IF OBJECT_ID ( 'dbo.uspCurrencyCursor', 'P' ) IS NOT NULL
    DROP PROCEDURE dbo.uspCurrencyCursor;
GO
CREATE PROCEDURE dbo.uspCurrencyCursor 
    @CurrencyCursor CURSOR VARYING OUTPUT
AS
    SET NOCOUNT ON;
    SET @CurrencyCursor = CURSOR
    FORWARD_ONLY STATIC FOR
      SELECT CurrencyCode, Name
      FROM Sales.Currency;
    OPEN @CurrencyCursor;
GO

Als Nächstes wird ein Batch ausgeführt, der eine lokale Cursorvariable deklariert, die Prozedur ausführt, um der lokalen Variablen den Cursor zuzuweisen, und dann die Zeilen aus dem Cursor abruft.

USE AdventureWorks;
GO
DECLARE @MyCursor CURSOR;
EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN;
     FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
GO