Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der ODBC-Treiber für SQL Server Native Client verwendet Servercursor, um die in der ODBC-Spezifikation definierte Cursorfunktionalität zu implementieren. Eine ODBC-Anwendung steuert das Cursorverhalten mithilfe von SQLSetStmtAttr , um verschiedene Anweisungsattribute festzulegen. Dies sind die Attribute und deren Standardwerte.
| Merkmal | Standard |
|---|---|
| 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 zum Zeitpunkt der Ausführung einer SQL-Anweisung auf ihre Standardwerte festgelegt werden, verwendet der ODBC-Treiber von SQL Server Native Client keinen Servercursor, um das Resultset zu implementieren. Stattdessen wird ein Standardergebnissatz verwendet. Wenn eine dieser Optionen beim Ausführen einer SQL-Anweisung von ihren Standardwerten geändert wird, versucht der SQL Server Native Client ODBC-Treiber, einen Servercursor zum Implementieren des Resultsets zu verwenden.
Standardergebnissätze unterstützen alle Transact-SQL-Anweisungen. Es gibt keine Einschränkungen für die Typen von SQL-Anweisungen, die bei Verwendung eines Standardergebnissatzes ausgeführt werden können.
Servercursor unterstützen nicht alle Transact-SQL Anweisungen. Servercursor unterstützen keine SQL-Anweisung, die mehrere Resultsets generiert.
Die folgenden Arten von Anweisungen werden von Servercursorn nicht unterstützt:
Haufen
SQL-Anweisungen, die aus zwei oder mehr einzelnen SQL SELECT-Anweisungen erstellt wurden, z. B.:
SELECT * FROM Authors; SELECT * FROM TitlesGespeicherte Prozeduren mit mehreren SELECT-Anweisungen
SQL-Anweisungen, die eine gespeicherte Prozedur ausführen, die mehr als eine SELECT-Anweisung enthält. Dazu gehören SELECT-Anweisungen, die Parameter oder Variablen ausfüllen.
Schlüsselwörter
SQL-Anweisungen, die die Schlüsselwörter FOR BROWSE oder INTO enthalten.
Wenn in SQL Server eine SQL-Anweisung, die einer dieser Bedingungen entspricht, mit einem Servercursor ausgeführt wird, wird der Servercursor implizit in einen Standardergebnissatz konvertiert. Nachdem SQLExecDirect oder SQLExecute SQL_SUCCESS_WITH_INFO zurückgegeben haben, werden die Cursorattribute auf ihre Standardeinstellungen zurückgesetzt.
SQL-Anweisungen, die nicht den oben genannten Kategorien entsprechen, können mit allen Attributeinstellungen für Anweisungen ausgeführt werden. Sie funktionieren gleichermaßen gut mit einem Standardergebnissatz oder einem Servercursor.
Irrtümer
In SQL Server 7.0 und höher wird versucht, eine Anweisung auszuführen, die mehrere Resultsets erzeugt, SQL_SUCCESS_WITH INFO und die folgende Meldung generiert:
SqlState: 01S02"
pfNative: 0
szErrorMsgString: "[Microsoft][SQL Server Native Client][SQL Server]
Cursor type changed."
ODBC-Anwendungen, die diese Nachricht empfangen, können SQLGetStmtAttr aufrufen, um die aktuellen Cursoreinstellungen zu bestimmen.
Ein Versuch, eine Prozedur mit mehreren SELECT-Anweisungen auszuführen, wenn Servercursor verwendet werden, wird der folgende Fehler generiert:
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.
Ein Versuch, einen Batch mit mehreren SELECT-Anweisungen auszuführen, wenn Servercursor verwendet werden, wird der folgende Fehler generiert:
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 ihre Standardwerte zurücksetzen, bevor Sie versuchen, die Anweisung auszuführen.