Partager via


Construction d'instructions SQL pour les curseurs

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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 Default
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 serveur pour implémenter le jeu de résultats ; à la place, il utilise un jeu de résultats par défaut. Si l’une de ces options est modifiée par rapport à ses valeurs 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 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 :

  • Lots

    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 serveur, le curseur du serveur est implicitement converti en jeu de résultats par défaut. Une fois que SQLExecDirect ou SQLExecute a retourné SQL_SUCCESS_WITH_INFO, les attributs de curseur sont rétablis 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 qui reçoivent ce message peuvent appeler SQLGetStmtAttr pour déterminer les paramètres de curseur actuels.

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)