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.