Compartir a través de


Crear instrucciones SQL para cursores

El controlador ODBC de SQL Server Native Client usa cursores de servidor para implementar la funcionalidad de cursor que se define en la especificación ODBC. Una aplicación ODBC controla el comportamiento del cursor utilizando SQLSetStmtAttr para establecer distintos atributos de instrucción. É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

Si estas opciones están establecidas en sus valores predeterminados en el momento de ejecución de una instrucción SQL, el controlador ODBC de SQL Server Native Client no utiliza un cursor de servidor para implementar el conjunto de resultados, sino que utiliza un conjunto de resultados predeterminado. Si se modifica el valor predeterminado de alguna de estas opciones en el momento de ejecución de 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:

  • Lotes

    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 COMPUTE, COMPUTE BY, FOR BROWSE o INTO.

En SQL Server, si se ejecuta una instrucción SQL que se ajusta a alguna de estas condiciones con un cursor de servidor, el cursor de servidor se convierte de forma implícita en un conjunto de resultados predeterminado. Una vez que SQLExecDirect o SQLExecute devuelva SQL_SUCCESS_WITH_INFO, los atributos de cursor volverán a establecerse en sus valores de configuración predeterminados.

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.

Errores

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

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 los valores de cursor actuales.

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.

Un intento de ejecutar una instrucción SELECT que contiene una cláusula COMPUTE cuando se utilizan los cursores de servidor genera el error siguiente:

SqlState: 42000
pfNative: 16907
szErrorMsgString: [Microsoft][SQL Server Native Client][SQL Server]
               'COMPUTE' is not allowed in cursor statements.

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.

Vea también

Conceptos