DECLARE CURSOR (Transact-SQL)DECLARE CURSOR (Transact-SQL)

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Define los atributos de un cursor de servidor de Transact-SQLTransact-SQL, como su comportamiento de desplazamiento y la consulta utilizada para generar el conjunto de resultados sobre el que opera el cursor.Defines the attributes of a Transact-SQLTransact-SQL server cursor, such as its scrolling behavior and the query used to build the result set on which the cursor operates. DECLARE CURSOR acepta tanto una sintaxis basada en el estándar ISO como una sintaxis que usa un conjunto de extensiones Transact-SQLTransact-SQL.DECLARE CURSOR accepts both a syntax based on the ISO standard and a syntax using a set of Transact-SQLTransact-SQL extensions.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

ISO Syntax  
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR   
     FOR select_statement   
     [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]  
[;]  
Transact-SQL Extended Syntax  
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]   
     [ FORWARD_ONLY | SCROLL ]   
     [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]   
     [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]   
     [ TYPE_WARNING ]   
     FOR select_statement   
     [ FOR UPDATE [ OF column_name [ ,...n ] ] ]  
[;]  

ArgumentosArguments

cursor_namecursor_name
Es el nombre del cursor de servidor de Transact-SQLTransact-SQL definido.Is the name of the Transact-SQLTransact-SQL server cursor defined. cursor_name debe respetar las reglas de los identificadores.cursor_name must conform to the rules for identifiers.

INSENSITIVEINSENSITIVE
Define un cursor que hace una copia temporal de los datos que utiliza.Defines a cursor that makes a temporary copy of the data to be used by the cursor. Todas las solicitudes que se realizan al cursor se responden desde esta tabla temporal de tempdb; por tanto, las modificaciones realizadas en las tablas base no se reflejan en los datos devueltos por las operaciones de captura realizadas en el cursor y, además, este cursor no admite modificaciones.All requests to the cursor are answered from this temporary table in tempdb; therefore, modifications made to base tables are not reflected in the data returned by fetches made to this cursor, and this cursor does not allow modifications. Cuando se usa la sintaxis ISO, si se omite INSENSITIVE, las eliminaciones y actualizaciones confirmadas que se hayan realizado en las tablas subyacentes (por cualquier usuario) se reflejan en capturas posteriores.When ISO syntax is used, if INSENSITIVE is omitted, committed deletes and updates made to the underlying tables (by any user) are reflected in subsequent fetches.

SCROLLSCROLL
Especifica que todas las opciones de captura (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) están disponibles.Specifies that all fetch options (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) are available. Si no se especifica SCROLL con un DECLARE CURSOR de estilo ISO, NEXT es la única opción de captura admitida.If SCROLL is not specified in an ISO DECLARE CURSOR, NEXT is the only fetch option supported. SCROLL no se puede especificar si también se especifica FAST_FORWARD.SCROLL cannot be specified if FAST_FORWARD is also specified. Si no se especifica SCROLL, solo está disponible la opción de captura NEXT y el cursor se convierte en FORWARD_ONLY.If SCROLL is not specified then only the fetch option NEXT is available and the cursor becomes FORWARD_ONLY.

select_statementselect_statement
Es una instrucción SELECT estándar que define el conjunto de resultados del cursor.Is a standard SELECT statement that defines the result set of the cursor. Las palabras clave FOR BROWSE y INTO no se permiten dentro de una instrucción select_statement de una declaración de cursor.The keywords FOR BROWSE, and INTO are not allowed within select_statement of a cursor declaration.

SQL ServerSQL Server convierte implícitamente el cursor a otro tipo si las cláusulas de la instrucción select_statement entran en conflicto con la funcionalidad del tipo de cursor solicitado.implicitly converts the cursor to another type if clauses in select_statement conflict with the functionality of the requested cursor type.

READ ONLYREAD ONLY
Evita que se efectúen actualizaciones a través de este cursor.Prevents updates made through this cursor. No se puede hacer referencia al cursor en una cláusula WHERE CURRENT OF de una instrucción UPDATE o DELETE.The cursor cannot be referenced in a WHERE CURRENT OF clause in an UPDATE or DELETE statement. Esta opción reemplaza la capacidad predeterminada de actualizar el cursor.This option overrides the default capability of a cursor to be updated.

UPDATE [OF column_name [,...n]]UPDATE [OF column_name [,...n]]
Define las columnas actualizables en el cursor.Defines updatable columns within the cursor. Si se especifica OF <column_name> [, <… n>], solo las columnas enumeradas admiten modificaciones.If OF <column_name> [, <... n>] is specified, only the columns listed allow modifications. Si se especifica UPDATE sin indicar una lista de columnas, se pueden actualizar todas las columnas.If UPDATE is specified without a column list, all columns can be updated.

cursor_namecursor_name
Es el nombre del cursor de servidor de Transact-SQLTransact-SQL definido.Is the name of the Transact-SQLTransact-SQL server cursor defined. cursor_name debe respetar las reglas de los identificadores.cursor_name must conform to the rules for identifiers.

LOCALLOCAL
Especifica que el alcance del cursor es local para el proceso por lotes, procedimiento almacenado o desencadenador en que se creó el cursor.Specifies that the scope of the cursor is local to the batch, stored procedure, or trigger in which the cursor was created. El nombre del cursor solo es válido en este ámbito.The cursor name is only valid within this scope. Se puede hacer referencia al cursor mediante variables de cursor locales del lote, procedimiento almacenado, desencadenador o parámetro OUTPUT del procedimiento almacenado.The cursor can be referenced by local cursor variables in the batch, stored procedure, or trigger, or a stored procedure OUTPUT parameter. El parámetro OUTPUT se usa para devolver el cursor local al proceso por lotes, procedimiento almacenado o desencadenador que realiza la llamada, que puede asignar el parámetro a una variable de cursor para hacer referencia al cursor cuando finalice el procedimiento almacenado.An OUTPUT parameter is used to pass the local cursor back to the calling batch, stored procedure, or trigger, which can assign the parameter to a cursor variable to reference the cursor after the stored procedure terminates. La asignación del cursor se cancela implícitamente cuando el proceso por lotes, procedimiento almacenado o desencadenador finaliza, a menos que el cursor se haya devuelto en un parámetro OUTPUT.The cursor is implicitly deallocated when the batch, stored procedure, or trigger terminates, unless the cursor was passed back in an OUTPUT parameter. Si se vuelve a pasar el parámetro OUTPUT, la asignación del cursor se cancela cuando se cancela la asignación de la última variable que hace referencia a este, o bien cuando esta se sale del ámbito.If it is passed back in an OUTPUT parameter, the cursor is deallocated when the last variable referencing it is deallocated or goes out of scope.

GLOBALGLOBAL
Especifica que el alcance del cursor es global para la conexión.Specifies that the scope of the cursor is global to the connection. Se puede hacer referencia al nombre del cursor en cualquier procedimiento almacenado o lote que se ejecute durante la conexión.The cursor name can be referenced in any stored procedure or batch executed by the connection. La asignación del cursor solo se cancela implícitamente cuando se produce la desconexión.The cursor is only implicitly deallocated at disconnect.

Nota

Si no se especifica GLOBAL ni LOCAL, el valor predeterminado se controla mediante la configuración de la opción de base de datos default to local cursor.If neither GLOBAL or LOCAL is specified, the default is controlled by the setting of the default to local cursor database option.

FORWARD_ONLYFORWARD_ONLY
Especifica que el cursor solo se puede desplazar hacia delante y de la primera a la última fila.Specifies that the cursor can only move forward and be scrolled from the first to the last row. FETCH NEXT es la única opción de captura admitida.FETCH NEXT is the only supported fetch option. Las instrucciones INSERT, UPDATE y DELETE que ejecuta el usuario actual (o que confirman otros usuarios) y que afectan a las filas del conjunto de resultados son visibles a medida que se capturan las filas.All insert, update, and delete statements made by the current user (or committed by other users) that affect rows in the result set are visible as the rows are fetched. Pero como el cursor no se puede desplazar hacia atrás, los cambios realizados en las filas de la base de datos tras capturar la fila no son visibles a través del cursor.Because the cursor cannot be scrolled backward, however, changes made to rows in the database after the row was fetched are not visible through the cursor. Los cursores de solo avance son dinámicos de forma predeterminada, lo que significa que todos los cambios se detectan cuando se procesa la fila actual.Forward-only cursors are dynamic by default, meaning that all changes are detected as the current row is processed. Esto proporciona una apertura del cursor más rápida y permite que el conjunto de resultados muestre las actualizaciones realizadas en las tablas subyacentes.This provides faster cursor opening and enables the result set to display updates made to the underlying tables. Aunque los cursores de solo avance no admiten el desplazamiento hacia atrás, las aplicaciones pueden volver al principio del conjunto de resultados si se cierra el cursor y se vuelve a abrir.While forward-only cursors do not support backward scrolling, applications can return to the beginning of the result set by closing and reopening the cursor. Si se especifica FORWARD_ONLY sin las palabras clave STATIC, KEYSET o DYNAMIC, el cursor opera como un cursor dinámico.If FORWARD_ONLY is specified without the STATIC, KEYSET, or DYNAMIC keywords, the cursor operates as a dynamic cursor. Si no se especifica FORWARD_ONLY ni SCROLL, FORWARD_ONLY será el valor predeterminado, excepto si se especifican las palabras clave STATIC, KEYSET o DYNAMIC.When neither FORWARD_ONLY nor SCROLL is specified, FORWARD_ONLY is the default, unless the keywords STATIC, KEYSET, or DYNAMIC are specified. El valor predeterminado de los cursores STATIC, KEYSET y DYNAMIC es SCROLL.STATIC, KEYSET, and DYNAMIC cursors default to SCROLL. Al contrario que las API de bases de datos (como ODBC y ADO), FORWARD_ONLY se admite con los cursores STATIC, KEYSET y DYNAMIC de Transact-SQLTransact-SQL.Unlike database APIs such as ODBC and ADO, FORWARD_ONLY is supported with STATIC, KEYSET, and DYNAMIC Transact-SQLTransact-SQL cursors.

STATICSTATIC
Especifica que el cursor siempre muestra el conjunto de resultados como estaba al abrir el cursor por primera vez, y realiza una copia temporal de los datos que va a usar el cursor.Specifies that the cursor always displays the result set as it was when the cursor was first opened, and makes a temporary copy of the data to be used by the cursor. Todas las solicitudes al cursor se responden desde esta tabla temporal de tempdb.All requests to the cursor are answered from this temporary table in tempdb. Por tanto, las operaciones de inserción, actualización y eliminación realizadas en las tablas base no se reflejan en los datos devueltos por las capturas realizadas por este cursor, que no detecta los cambios realizados en la pertenencia, el orden o los valores del conjunto de resultados una vez abierto el cursor.Therefore inserts, updates, and deletes made to base tables are not reflected in the data returned by fetches made to this cursor, and this cursor does not detect changes made to the membership, order, or values of the result set after the cursor is opened. Los cursores estáticos pueden detectar sus propias operaciones de inserción, actualización y eliminación, aunque no está obligados a hacerlo.Static cursors may detect their own updates, deletes, and inserts, although they are not required to do so. Por ejemplo, suponga que un cursor estático captura una fila y, después, otra aplicación la actualiza.For example, suppose a static cursor fetches a row, and another application then updates that row. Si la aplicación vuelve a capturar la fila del cursor estático, los valores que ve son iguales, a pesar de los cambios realizados por la otra aplicación.If the application refetches the row from the static cursor, the values it sees are unchanged, despite the changes made by the other application. Se admiten todos los tipos de desplazamiento.All types of scrolling are supported.

KEYSETKEYSET
Especifica que la pertenencia y el orden de las filas del cursor se fijan cuando se abre este cursor.Specifies that the membership and order of rows in the cursor are fixed when the cursor is opened. El conjunto de claves que identifica las filas de forma única está integrado en la tabla denominada tempdb de keyset.The set of keys that uniquely identify the rows is built into a table in tempdb known as the keyset. Este cursor proporciona la funcionalidad entre un cursor estático y dinámico en su capacidad para detectar los cambios.This cursor provides functionality between a static and a dynamic cursor in its ability to detect changes. Al igual que un cursor estático, no siempre detecta los cambios realizados en la pertenencia y el orden del conjunto de resultados.Like a static cursor, it does not always detect changes to the membership and order of the result set. Como un cursor dinámico, detecta cambios en los valores de las filas del conjunto de resultados.Like a dynamic cursor, it does detect changes to the values of rows in the result set. Los cursores controlados por conjunto de claves se supervisan mediante un conjunto de identificadores únicos (claves) denominado conjunto de claves.Keyset-driven cursors are controlled by a set of unique identifiers (keys) known as the keyset. Las claves se generan a partir de un conjunto de columnas que identifican las filas del conjunto de resultados de forma unívoca.The keys are built from a set of columns that uniquely identify the rows in the result set. El conjunto de claves es el conjunto de valores de clave de todas las filas devueltas por la instrucción de consulta.The keyset is the set of key values from all the rows returned by the query statement. Con los cursores controlados por conjunto de claves, se crea y se guarda una clave para cada fila del cursor y se almacena en la estación de trabajo cliente o en el servidor.With keyset-driven cursors, a key is built and saved for each row in the cursor and stored either on the client workstation or on the server. Al acceder a cada fila, se usa la clave almacenada para capturar los valores de datos actuales desde el origen de datos.When you access each row, the stored key is used to fetch the current data values from the data source. En un cursor controlado por conjunto de claves, la pertenencia al conjunto de resultados se inmoviliza cuando se completa totalmente el conjunto de claves.In a keyset-driven cursor, result set membership is frozen when the keyset is fully populated. Por tanto, las adiciones o actualizaciones que afectan a la pertenencia no forman parte del conjunto de resultados hasta que se vuelva a abrir.Thereafter, additions or updates that affect membership are not a part of the result set until it is reopened. Los cambios en los valores de datos (realizados por el propietario del conjunto de claves o por otros procesos) son visibles cuando el usuario se desplaza por el conjunto de resultados:Changes to data values (made either by the keyset owner or other processes) are visible as the user scrolls through the result set:

  • Si se elimina una fila, un intento de capturar la fila devuelve un valor de -2 para @@FETCH_STATUS, porque la fila eliminada aparece como un hueco en el conjunto de resultados.If a row is deleted, an attempt to fetch the row returns an @@FETCH_STATUS of -2 because the deleted row appears as a gap in the result set. La clave para la fila existe en el conjunto de claves, pero la fila ya no existe en el conjunto de resultados.The key for the row exists in the keyset, but the row no longer exists in the result set.
  • Las operaciones de inserción realizadas fuera del cursor (por otros procesos) son visibles solo si el cursor se cierra y se vuelve a abrir.Inserts made outside the cursor (by other processes) are visible only if the cursor is closed and reopened. Las operaciones de inserción realizadas desde dentro del cursor son visibles al final del conjunto de resultados.Inserts made from inside the cursor are visible at the end of the result set.
  • Las actualizaciones de valores de clave de fuera del cursor son similares a la eliminación de la fila anterior seguida por la inserción de la nueva fila.Updates of key values from outside the cursor resemble a delete of the old row followed by an insert of the new row. La fila con los nuevos valores no es visible y los intentos de capturar la fila con los valores anteriores devuelven un @@FETCH_STATUS de -2.The row with the new values is not visible, and attempts to fetch the row with the old values return an @@FETCH_STATUS of -2. Los nuevos valores son visibles si la actualización se realiza a través del cursor especificando la cláusula WHERE CURRENT OF.The new values are visible if the update is done through the cursor by specifying the WHERE CURRENT OF clause.

Nota

Si la consulta hace referencia por lo menos a una tabla sin un índice único, el cursor de conjunto de claves se convierte en cursor estático.If the query references at least one table without a unique index, the keyset cursor is converted to a static cursor.

DYNAMICDYNAMIC
Define un cursor que refleja todos los cambios realizados en las filas de su conjunto de resultados cuando se desplaza alrededor del cursor y se captura un registro nuevo, independientemente de si los cambios se producen desde dentro del cursor o los realizan otros usuarios fuera del cursor.Defines a cursor that reflects all data changes made to the rows in its result set as you scroll around the cursor and fetch a new record, regardless of whether the changes occur from inside the cursor or by other users outside the cursor. Por tanto, todas las instrucciones UPDATE, INSERT y DELETE que realizan todos los usuarios son visibles a través del cursor.Therefore all insert, update, and delete statements made by all users are visible through the cursor. Los valores de los datos, el orden y la pertenencia de las filas pueden cambiar en cada captura.The data values, order, and membership of the rows can change on each fetch. La opción de captura ABSOLUTE no se puede usar con los cursores dinámicos.The ABSOLUTE fetch option is not supported with dynamic cursors. Las actualizaciones realizadas fuera del cursor no son visibles hasta que se confirman (a menos que el nivel de aislamiento de transacciones del cursor se establezca en UNCOMMITTED).Updates made outside the cursor are not visible until they are committed (unless the cursor transaction isolation level is set to UNCOMMITTED). Por ejemplo, suponga que un cursor dinámico captura dos filas y después otra aplicación actualiza una de esas filas y elimina la otra.For example, suppose a dynamic cursor fetches two rows and another application then updates one of those rows and deletes the other. Si después el cursor dinámico captura esas filas, no encontrará la que se ha eliminado, pero mostrará los valores nuevos para la fila actualizada.If the dynamic cursor then fetches those rows, it will not find the deleted row, but it will display the new values for the updated row.

FAST_FORWARDFAST_FORWARD
Especifica un cursor FORWARD_ONLY, READ_ONLY con optimizaciones de rendimiento habilitadas.Specifies a FORWARD_ONLY, READ_ONLY cursor with performance optimizations enabled. FAST_FORWARD no se puede especificar si también se especifica SCROLL o FOR_UPDATE.FAST_FORWARD cannot be specified if SCROLL or FOR_UPDATE is also specified. Este tipo de cursor no permite las modificaciones de datos desde dentro del cursor.This type of cursor does not allow data modifications from inside the cursor.

Nota

Tanto FAST_FORWARD como FORWARD_ONLY se pueden usar en la misma instrucción DECLARE CURSOR.Both FAST_FORWARD and FORWARD_ONLY can be used in the same DECLARE CURSOR statement.

READ_ONLYREAD_ONLY
Evita que se efectúen actualizaciones a través de este cursor.Prevents updates made through this cursor. No se puede hacer referencia al cursor en una cláusula WHERE CURRENT OF de una instrucción UPDATE o DELETE.The cursor cannot be referenced in a WHERE CURRENT OF clause in an UPDATE or DELETE statement. Esta opción reemplaza la capacidad predeterminada de actualizar el cursor.This option overrides the default capability of a cursor to be updated.

SCROLL_LOCKSSCROLL_LOCKS
Especifica que existan garantías de que las actualizaciones o las cancelaciones posicionadas realizadas a través del cursor se lleven a cabo correctamente.Specifies that positioned updates or deletes made through the cursor are guaranteed to succeed. SQL ServerSQL Server bloquea las filas mientras se leen en el cursor para garantizar su disponibilidad en modificaciones posteriores.locks the rows as they are read into the cursor to ensure their availability for later modifications. SCROLL_LOCKS no se puede especificar si también se especifica FAST_FORWARD o STATIC.SCROLL_LOCKS cannot be specified if FAST_FORWARD or STATIC is also specified.

OPTIMISTICOPTIMISTIC
Especifica que las actualizaciones o las cancelaciones posicionadas realizadas a través del cursor no se lleven a cabo correctamente si la fila se ha actualizado desde que se leyó en el cursor.Specifies that positioned updates or deletes made through the cursor do not succeed if the row has been updated since it was read into the cursor. SQL ServerSQL Server no bloquea las filas cuando se leen en el cursor.does not lock rows as they are read into the cursor. En su lugar, usa comparaciones de valores de columna timestamp o un valor de suma de comprobación si la tabla no tiene columnas timestamp para determinar si la fila se ha modificado después de leerla en el cursor.It instead uses comparisons of timestamp column values, or a checksum value if the table has no timestamp column, to determine whether the row was modified after it was read into the cursor. Si la fila se ha modificado, la actualización o eliminación posicionada fracasa.If the row was modified, the attempted positioned update or delete fails. OPTIMISTIC no se puede especificar si también se especifica FAST_FORWARD.OPTIMISTIC cannot be specified if FAST_FORWARD is also specified.

TYPE_WARNINGTYPE_WARNING
Especifica que se envía un mensaje de advertencia al cliente si el cursor se convierte implícitamente del tipo solicitado a otro.Specifies that a warning message is sent to the client when the cursor is implicitly converted from the requested type to another.

select_statementselect_statement
Es una instrucción SELECT estándar que define el conjunto de resultados del cursor.Is a standard SELECT statement that defines the result set of the cursor. Las palabras clave COMPUTE, COMPUTE BY, FOR BROWSE y INTO no se permiten dentro de una instrucción select_statement de una declaración de cursor.The keywords COMPUTE, COMPUTE BY, FOR BROWSE, and INTO are not allowed within select_statement of a cursor declaration.

Nota

Puede usar una sugerencia de consulta dentro de una declaración de cursor; pero, si también usa la cláusula FOR UPDATE OF, especifique OPTION (<query_hint>) después de FOR UPDATE OF.You can use a query hint within a cursor declaration; however, if you also use the FOR UPDATE OF clause, specify OPTION (<query_hint>) after FOR UPDATE OF.

SQL ServerSQL Server convierte implícitamente el cursor a otro tipo si las cláusulas de la instrucción select_statement entran en conflicto con la funcionalidad del tipo de cursor solicitado.implicitly converts the cursor to another type if clauses in select_statement conflict with the functionality of the requested cursor type. Para obtener más información, vea el tema relativo a las conversiones de cursor implícitas.For more information, see Implicit Cursor Conversions.

FOR UPDATE [OF column_name [,...n]]FOR UPDATE [OF column_name [,...n]]
Define las columnas actualizables en el cursor.Defines updatable columns within the cursor. Si se especifica OF <column_name> [, <... n>], solo las columnas enumeradas admiten modificaciones.If OF <column_name> [, <... n>] is supplied, only the columns listed allow modifications. Si se especifica UPDATE sin una lista de columnas, se pueden actualizar todas las columnas, a menos que se haya especificado la opción de simultaneidad READ_ONLY.If UPDATE is specified without a column list, all columns can be updated, unless the READ_ONLY concurrency option was specified.

NotasRemarks

DECLARE CURSOR define los atributos de un cursor de servidor de Transact-SQLTransact-SQL, como su comportamiento de desplazamiento y la consulta usada para generar el conjunto de resultados sobre el que opera el cursor.DECLARE CURSOR defines the attributes of a Transact-SQLTransact-SQL server cursor, such as its scrolling behavior and the query used to build the result set on which the cursor operates. La instrucción OPEN rellena el conjunto de resultados y la instrucción FETCH devuelve una fila del conjunto de resultados.The OPEN statement populates the result set, and FETCH returns a row from the result set. La instrucción CLOSE libera el conjunto de resultados actual asociado al cursor.The CLOSE statement releases the current result set associated with the cursor. La instrucción DEALLOCATE libera los recursos que usa el cursor.The DEALLOCATE statement releases the resources used by the cursor.

La primera forma de la instrucción DECLARE CURSOR usa la sintaxis ISO para declarar comportamientos del cursor.The first form of the DECLARE CURSOR statement uses the ISO syntax for declaring cursor behaviors. La segunda forma de DECLARE CURSOR usa extensiones de Transact-SQLTransact-SQL que permiten definir cursores con los mismos tipos de cursor usados en las funciones de cursor de la API de base de datos de ODBC o ADO.The second form of DECLARE CURSOR uses Transact-SQLTransact-SQL extensions that allow you to define cursors using the same cursor types used in the database API cursor functions of ODBC or ADO.

No se pueden combinar las dos formas.You cannot mix the two forms. Si especifica las palabras clave SCROLL o INSENSITIVE antes de la palabra clave CURSOR, no podrá usar ninguna palabra clave entre las palabras clave CURSOR y FOR <select_statement>.If you specify the SCROLL or INSENSITIVE keywords before the CURSOR keyword, you cannot use any keywords between the CURSOR and FOR <select_statement> keywords. Si especifica una palabra clave entre las palabras clave CURSOR y FOR <select_statement>, no podrá especificar SCROLL o INSENSITIVE antes de la palabra clave CURSOR.If you specify any keywords between the CURSOR and FOR <select_statement> keywords, you cannot specify SCROLL or INSENSITIVE before the CURSOR keyword.

Si una DECLARE CURSOR que use la sintaxis Transact-SQLTransact-SQL no especifica READ_ONLY, OPTIMISTIC o SCROLL_LOCKS, el valor predeterminado será el siguiente:If a DECLARE CURSOR using Transact-SQLTransact-SQL syntax does not specify READ_ONLY, OPTIMISTIC, or SCROLL_LOCKS, the default is as follows:

  • Si la instrucción SELECT no acepta actualizaciones (permisos insuficientes, acceso a tablas remotas que no aceptan actualizaciones, etc.), el cursor es del tipo READ_ONLY.If the SELECT statement does not support updates (insufficient permissions, accessing remote tables that do not support updates, and so on), the cursor is READ_ONLY.

  • El valor predeterminado de los cursores STATIC y FAST_FORWARD es READ_ONLY.STATIC and FAST_FORWARD cursors default to READ_ONLY.

  • El valor predeterminado de los cursores DYNAMIC y KEYSET es OPTIMISTIC.DYNAMIC and KEYSET cursors default to OPTIMISTIC.

Solo se puede hacer referencia a nombres de cursores mediante otras instrucciones Transact-SQLTransact-SQL.Cursor names can be referenced only by other Transact-SQLTransact-SQL statements. No se puede hacer referencia a nombres de cursores mediante funciones de la API de base de datos.They cannot be referenced by database API functions. Por ejemplo, después de declarar un cursor, no se puede hacer referencia al nombre del cursor desde funciones o métodos de OLE DB, ODBC o ADO.For example, after declaring a cursor, the cursor name cannot be referenced from OLE DB, ODBC or ADO functions or methods. No se pueden capturar las filas del cursor con las funciones o métodos de captura de las API; las filas solo se pueden capturar mediante instrucciones FETCH de Transact-SQLTransact-SQL.The cursor rows cannot be fetched using the fetch functions or methods of the APIs; the rows can be fetched only by Transact-SQLTransact-SQL FETCH statements.

Una vez que se ha declarado un cursor, se pueden utilizar estos procedimientos almacenados del sistema para determinar las características del cursor.After a cursor has been declared, these system stored procedures can be used to determine the characteristics of the cursor.

Procedimientos almacenados del sistemaSystem stored procedures DescripciónDescription
sp_cursor_listsp_cursor_list Devuelve la lista de los cursores que están visibles actualmente en la conexión y sus atributos.Returns a list of cursors currently visible on the connection and their attributes.
sp_describe_cursorsp_describe_cursor Describe los atributos de un cursor, por ejemplo si es de solo avance o de desplazamiento.Describes the attributes of a cursor, such as whether it is a forward-only or scrolling cursor.
sp_describe_cursor_columnssp_describe_cursor_columns Describe los atributos de las columnas en el conjunto de resultados del cursor.Describes the attributes of the columns in the cursor result set.
sp_describe_cursor_tablessp_describe_cursor_tables Describe las tablas base a las que tiene acceso el cursor.Describes the base tables accessed by the cursor.

Se pueden usar variables como parte de la instrucción select_statement que declara un cursor.Variables may be used as part of the select_statement that declares a cursor. Los valores de las variables de cursor no cambian después de que se declara el cursor.Cursor variable values do not change after a cursor is declared.

PermisosPermissions

Los permisos para usar DECLARE CURSOR se asignan de forma predeterminada a los usuarios que tengan permisos para usar SELECT en las vistas, tablas y columnas usadas en el cursor.Permissions of DECLARE CURSOR default to any user that has SELECT permissions on the views, tables, and columns used in the cursor.

Limitaciones y restriccionesLimitations and Restrictions

No puede usar cursores ni desencadenadores en una tabla con un índice clúster de almacén de columnas.You cannot use cursors or triggers on a table with a clustered columnstore index. Esta restricción no se aplica a los índices no clúster de almacén de columnas; puede usar cursores y desencadenadores en una tabla con un índice no clúster de almacén de columnas.This restriction does not apply to nonclustered columnstore indexes; you can use cursors and triggers on a table with a nonclustered columnstore index.

EjemplosExamples

A.A. Uso de cursores simples y su sintaxisUsing simple cursor and syntax

El conjunto de resultados generado al abrir este cursor contiene todas las filas y todas las columnas de la tabla.The result set generated at the opening of this cursor includes all rows and all columns in the table. Este cursor se puede actualizar, y todas las actualizaciones y eliminaciones se representan en las búsquedas realizadas para este cursor.This cursor can be updated, and all updates and deletes are represented in fetches made against this cursor. FETCH NEXT es la única búsqueda disponible porque la opción SCROLL no se ha especificado.FETCH NEXT is the only fetch available because the SCROLL option has not been specified.

DECLARE vend_cursor CURSOR  
    FOR SELECT * FROM Purchasing.Vendor  
OPEN vend_cursor  
FETCH NEXT FROM vend_cursor;  

b.B. Uso de cursores anidados para elaborar resultados de informesUsing nested cursors to produce report output

En el ejemplo siguiente se muestra cómo se pueden anidar los cursores para elaborar informes complejos.The following example shows how cursors can be nested to produce complex reports. El cursor interno se declara para cada proveedor.The inner cursor is declared for each vendor.

SET NOCOUNT ON;  
  
DECLARE @vendor_id int, @vendor_name nvarchar(50),  
    @message varchar(80), @product nvarchar(50);  
  
PRINT '-------- Vendor Products Report --------';  
  
DECLARE vendor_cursor CURSOR FOR   
SELECT VendorID, Name  
FROM Purchasing.Vendor  
WHERE PreferredVendorStatus = 1  
ORDER BY VendorID;  
  
OPEN vendor_cursor  
  
FETCH NEXT FROM vendor_cursor   
INTO @vendor_id, @vendor_name  
  
WHILE @@FETCH_STATUS = 0  
BEGIN  
    PRINT ' '  
    SELECT @message = '----- Products From Vendor: ' +   
        @vendor_name  
  
    PRINT @message  
  
    -- Declare an inner cursor based     
    -- on vendor_id from the outer cursor.  
  
    DECLARE product_cursor CURSOR FOR   
    SELECT v.Name  
    FROM Purchasing.ProductVendor pv, Production.Product v  
    WHERE pv.ProductID = v.ProductID AND  
    pv.VendorID = @vendor_id  -- Variable value from the outer cursor  
  
    OPEN product_cursor  
    FETCH NEXT FROM product_cursor INTO @product  
  
    IF @@FETCH_STATUS <> 0   
        PRINT '         <<None>>'       
  
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
  
        SELECT @message = '         ' + @product  
        PRINT @message  
        FETCH NEXT FROM product_cursor INTO @product  
        END  
  
    CLOSE product_cursor  
    DEALLOCATE product_cursor  
        -- Get the next vendor.  
    FETCH NEXT FROM vendor_cursor   
    INTO @vendor_id, @vendor_name  
END   
CLOSE vendor_cursor;  
DEALLOCATE vendor_cursor;  

Consulte tambiénSee Also

@@FETCH_STATUS (Transact-SQL) @@FETCH_STATUS (Transact-SQL)
CLOSE (Transact-SQL) CLOSE (Transact-SQL)
Cursores (Transact-SQL) Cursors (Transact-SQL)
DEALLOCATE (Transact-SQL) DEALLOCATE (Transact-SQL)
FETCH (Transact-SQL) FETCH (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
sp_configure (Transact-SQL)sp_configure (Transact-SQL)