Crear instrucciones SQL para cursores

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

El controlador ODBC SQL Server Native Client usa cursores de servidor para implementar la funcionalidad de cursor definida en la especificación ODBC. Una aplicación ODBC controla el comportamiento del cursor mediante SQLSetStmtAttr para establecer atributos de instrucción diferentes. Éstos son los atributos y sus valores predeterminados.

Atributo Valor predeterminado
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

Cuando estas opciones se establecen en sus valores predeterminados en el momento en que se ejecuta una instrucción SQL, el controlador ODBC de SQL Server Native Client no usa un cursor de servidor para implementar el conjunto de resultados; en su lugar, usa un conjunto de resultados predeterminado. Si alguna de estas opciones cambia de sus valores predeterminados en el momento en que se ejecuta una instrucción SQL, el controlador ODBC de SQL Server Native Client intenta usar un cursor de servidor para implementar el conjunto de resultados.

Los conjuntos de resultados predeterminados admiten todas las instrucciones Transact-SQL. No hay ninguna restricción con respecto a los tipos de instrucciones SQL que pueden ejecutarse cuando se utiliza un conjunto de resultados predeterminado.

Los cursores de servidor no admiten todas las instrucciones Transact-SQL. Los cursores de servidor no admiten cualquier instrucción SQL que genere varios conjuntos de resultados.

Los cursores de servidor no admiten los siguientes tipos de instrucciones:

  • Instancias de Batch

    Instrucciones SQL generadas a partir de dos o más instrucciones SQL SELECT individuales como, por ejemplo:

    SELECT * FROM Authors; SELECT * FROM Titles  
    
  • Procedimientos almacenados con varias instrucciones SELECT

    Instrucciones SQL que ejecutan un procedimiento almacenado que contiene más de una instrucción SELECT. Entre estas instrucciones se incluyen las instrucciones SELECT que rellenan parámetros o variables.

  • Palabras clave

    Instrucciones SQL que contienen las palabras clave FOR BROWSE o INTO.

En SQL Server, si una instrucción SQL que coincide con cualquiera de estas condiciones se ejecuta con un cursor de servidor, el cursor de servidor se convierte implícitamente en un conjunto de resultados predeterminado. Después de que SQLExecDirect o SQLExecute devuelva SQL_SUCCESS_WITH_INFO, los atributos del cursor se volverán a establecer en su configuración predeterminada.

Las instrucciones SQL que no se ajustan a las categorías anteriores pueden ejecutarse con cualquier valor de atributo de instrucción; funcionan igual de bien con un conjunto de resultados predeterminado que con un cursor de servidor.

Errors

En SQL Server 7.0 y versiones posteriores, un intento de ejecutar una instrucción que genera varios conjuntos de resultados genera SQL_SUCCESS_WITH INFO y el siguiente mensaje:

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

Las aplicaciones ODBC que reciben este mensaje pueden llamar a SQLGetStmtAttr para determinar la configuración actual del cursor.

Un intento de ejecutar un procedimiento con varias instrucciones SELECT cuando se utilizan los cursores de servidor genera el error siguiente:

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.  

Un intento de ejecutar un lote con varias instrucciones SELECT cuando se utilizan los cursores de servidor genera el error siguiente:

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.  

Las aplicaciones ODBC que reciben estos errores deben restablecer todos los atributos de instrucción de cursor a sus valores predeterminados antes de intentar ejecutar la instrucción.

Consulte también

Ejecutar consultas (ODBC)