Crear instrucciones SQL para cursores
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
El controlador ODBC de 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.
Attribute | 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 se 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:
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 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 del 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 de 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.
Errores
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 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 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.