Partager via


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.

Voir aussi

Exécution de requêtes (ODBC)