Construction d'instructions SQL pour les curseurs
S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Le pilote ODBC SQL Server Native Client utilise des curseurs serveur pour implémenter la fonctionnalité de curseur définie dans la spécification ODBC. Une application ODBC contrôle le comportement du curseur à l’aide de SQLSetStmtAttr pour définir différents attributs d’instruction. Voici les attributs et leurs valeurs par défaut.
Attribut | Par défaut |
---|---|
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 |
Lorsque ces options sont définies sur leurs valeurs par défaut au moment de l’exécution d’une instruction SQL, le pilote ODBC SQL Server Native Client n’utilise pas de curseur de serveur pour implémenter le jeu de résultats ; Au lieu de cela, il utilise un jeu de résultats par défaut. Si l’une de ces options est modifiée par défaut au moment de l’exécution d’une instruction SQL, le pilote ODBC SQL Server Native Client tente d’utiliser un curseur de serveur pour implémenter le jeu de résultats.
Les jeux de résultats par défaut prennent en charge toutes les instructions Transact-SQL. Il n'y a pas de restrictions concernant les types d'instructions SQL qui peuvent être exécutés lors de l'utilisation d'un jeu de résultats par défaut.
Les curseurs serveur ne prennent pas en charge toutes les instructions Transact-SQL. Les curseurs côté serveur ne prennent pas en charge les instructions SQL qui génèrent plusieurs jeux de résultats.
Les types d'instructions suivants ne sont pas pris en charge par les curseurs côté serveur :
Noms feuilles
Les instructions SQL construites à partir de plusieurs instructions SQL SELECT individuelles, par exemple :
SELECT * FROM Authors; SELECT * FROM Titles
Procédures stockées avec plusieurs instructions SELECT
Instructions SQL qui exécutent une procédure stockée contenant plusieurs instructions SELECT. Cela inclut les instructions SELECT qui remplissent des paramètres ou des variables.
Mots clés
Instructions SQL contenant les mots clés FOR BROWSE ou INTO.
Dans SQL Server, si une instruction SQL qui correspond à l’une de ces conditions est exécutée avec un curseur de serveur, le curseur du serveur est implicitement converti en jeu de résultats par défaut. Une fois que SQLExecDirect ou SQLExecute retourne SQL_SUCCESS_WITH_INFO, les attributs du curseur sont définis sur leurs paramètres par défaut.
Les instructions SQL qui n'appartiennent à aucune des catégories précitées peuvent être exécutées avec tout paramètre d'attribut d'instruction ; elles fonctionnent aussi bien avec un jeu de résultats par défaut qu'avec un curseur côté serveur.
Erreurs
Dans SQL Server 7.0 et versions ultérieures, une tentative d’exécution d’une instruction qui produit plusieurs jeux de résultats génère SQL_SUCCESS_WITH INFO et le message suivant :
SqlState: 01S02"
pfNative: 0
szErrorMsgString: "[Microsoft][SQL Server Native Client][SQL Server]
Cursor type changed."
Les applications ODBC recevant ce message peuvent appeler SQLGetStmtAttr pour déterminer les paramètres actuels du curseur.
Toute tentative d'exécution d'une procédure avec plusieurs instructions SELECT lors de l'utilisation de curseurs côté serveur génère l'erreur suivante :
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.
Toute tentative d'exécution d'un lot avec plusieurs instructions SELECT lors de l'utilisation de curseurs côté serveur génère l'erreur suivante :
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.
Les applications ODBC qui reçoivent ces erreurs doivent réinitialiser tous les attributs d'instructions de curseur à leurs valeurs par défaut avant d'essayer d'exécuter l'instruction.