Freigeben über


Erstellen von SQL-Anweisungen für Cursor

Der ODBC-Treiber von SQL Server Native Client verwendet Servercursor, um die in der ODBC-Spezifikation definierte Cursorfunktionalität zu implementieren. Eine ODBC-Anwendung kontrolliert das Cursorverhalten, indem sie mit SQLSetStmtAttr andere Anweisungsattribute festlegt. Nachfolgend sind die Attribute und ihre Standardwerte aufgeführt.

Attribut

Standardwert

SQL_ATTR_CONCURRENCY

SQL_CONCUR_READ_ONLY

SQL_ATTR_CURSOR_TYPE

SQL_CURSOR_FORWARD_ONLY

SQL_ATTR_CURSOR_SCROLLABLE

SQL_NONSCROLLABLE

SQL_ATTR_CURSOR_SENSITIVITY

SQL_UNSPECIFIED

SQL_ATTR_ROW_ARRAY_SIZE

1

Wenn diese Optionen zu dem Zeitpunkt, zu dem eine SQL-Anweisung ausgeführt wird, auf ihre Standardeinstellung festgelegt sind, dann verwendet der ODBC-Treiber von SQL Server Native Client keinen Servercursor zur Implementierung des Resultsets, sondern stattdessen ein Standardresultset. Wenn eine dieser Optionen zu dem Zeitpunkt, zu dem eine SQL-Anweisung ausgeführt wird, nicht auf ihre Standardeinstellung festgelegt ist, dann versucht der ODBC-Treiber von SQL Server Native Client einen Servercursor zur Implementierung des Resultsets zu verwenden.

Standardresultsets unterstützen alle Transact-SQL-Anweisungen. Es gibt keine Einschränkungen hinsichtlich der Arten von SQL-Anweisungen, die bei Verwendung eines Standardresultsets ausgeführt werden können.

Nicht alle Transact-SQL-Anweisungen werden von Servercursorn unterstützt. Servercursor unterstützen keine SQL-Anweisungen, die mehrere Resultsets generieren.

Die folgenden Typen von Anweisungen werden von Serversursorn nicht unterstützt:

  • Batches

    Aus zwei oder mehr einzelnen SQL SELECT-Anweisungen erstellte SQL-Anweisungen, Beispiel.:

    SELECT * FROM Authors; SELECT * FROM Titles
    
  • Gespeicherte Prozeduren mit mehreren SELECT-Anweisungen

    SQL-Anweisungen, die eine gespeicherte Prozedur ausführen, die mehr als eine SELECT-Anweisung enthält Hierzu gehören auch SELECT-Anweisungen, mit denen Parameter- oder Variablenwerte abgerufen werden.

  • Schlüsselwörter

    SQL-Anweisungen, die die Schlüsselwörter FOR BROWSE oder INTO enthalten.

Wenn in SQL Server eine SQL-Anweisung ausgeführt wird, die eine dieser Bedingungen erfüllt, dann wird der Servercursor implizit in ein Standardresultset konvertiert. Nachdem SQLExecDirect oder SQLExecute SQL_SUCCESS_WITH_INFO zurückgegeben hat, werden die Cursorattribute werden auf ihre Standardeinstellungen zurückgesetzt.

SQL-Anweisungen, die nicht in die oben genannten Kategorien passen, können mit beliebigen Anweisungsattributeinstelllungen ausgeführt werden. Sie funktionieren sowohl mit einem Standardresultset als auch einem Servercursor gleich gut.

Fehler

In SQL Server 7.0 und höher führt der Versuch, eine Anweisung auszuführen, die mehrere Resultsets erzeugt, zur Ausgabe von SQL_SUCCESS_WITH INFO und der folgenden Meldung:

SqlState: 01S02"
pfNative: 0
szErrorMsgString: "[Microsoft][SQL Server Native Client][SQL Server]
               Cursor type changed."

ODBC-Anwendungen, die diese Meldung empfangen, können SQLGetStmtAttr aufrufen, um die aktuellen Cursoreinstellungen zu bestimmen.

Der Versuch, bei Verwendung von Servercursorn eine Prozedur mit mehreren SELECT-Anweisungen auszuführen, erzeugt folgenden Fehler:

SqlState: 42000
pfNative: 16937
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
               A server cursor is not allowed on a stored procedure
               with more than one SELECT statement in it. Use a
               default result set or client cursor.

Der Versuch, bei Verwendung von Servercursorn einen Batch mit mehreren SELECT-Anweisungen auszuführen, erzeugt folgenden Fehler:

SqlState: 42000
pfNative: 16938
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
               sp_cursoropen. The statement parameter can only
               be a single SELECT statement or a single stored 
               procedure.

ODBC-Anwendungen, die diese Fehler erhalten, müssen alle Cursoranweisungsattribute auf die jeweilige Standardeinstellung zurücksetzen, bevor sie die Anweisung auszuführen versuchen.

Siehe auch

Konzepte

Ausführen von Abfragen (ODBC)