- 14/03/2017
- 13 minutos de lectura
-
- c
- r
- i
- M
- m
-
+6
Se aplica a: SQL Server (todas las versiones compatibles ) Azure SQL Database
Define los atributos de un cursor de servidor Transact-SQL, como su comportamiento de desplazamiento y la consulta utilizada para generar el conjunto de resultados en el que el cursor opera. DECLARE CURSOR
acepta tanto una sintaxis basada en el estándar ISO como una sintaxis que utiliza un conjunto de extensiones Transact-SQL.
Convenciones de sintaxis de Transact-SQL
Sintaxis
Nota
Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte la documentación de versiones anteriores .
Argumentos
cursor_name
Es el nombre del cursor del servidor Transact-SQL definido. cursor_name debe ajustarse a las reglas para identificadores.
INSENSITIVE
Define un cursor que hace una copia temporal de los datos que utilizará el cursor. Todas las solicitudes al cursor se responden desde esta tabla temporal en tempdb; por lo tanto, las modificaciones realizadas en las tablas base no se reflejan en los datos devueltos por las recuperaciones realizadas en este cursor y este cursor no permite modificaciones. Cuando se utiliza la sintaxis ISO, si se omite INSENSITIVE
, las eliminaciones confirmadas y las actualizaciones realizadas en las tablas subyacentes (por cualquier usuario) se reflejan en las búsquedas posteriores.
SCROLL
Especifica que todas las opciones de recuperación (FIRST
, LAST
, PRIOR
, NEXT
, RELATIVE
, ABSOLUTE
) están disponibles. Si SCROLL
no se especifica en una DECLARE CURSOR
ISO, NEXT
es la única opción de recuperación admitida . SCROLL
no se puede especificar si también se especifica FAST_FORWARD
. Si no se especifica SCROLL
, solo está disponible la opción de recuperación NEXT
y el cursor se convierte en FORWARD_ONLY
.
select_statement
Es una instrucción SELECT
estándar que define el conjunto de resultados del cursor. Las palabras clave FOR BROWSE
y INTO
no están permitidas dentro de select_statement de una declaración de cursor.
SQL Server convierte implícitamente el cursor a otro tipo si las cláusulas en select_statement entran en conflicto con la funcionalidad del tipo de cursor solicitado.
READ ONLY
Evita las actualizaciones realizadas a través de este cursor. No se puede hacer referencia al cursor en una cláusula WHERE CURRENT OF
en una instrucción UPDATE
o DELETE
. Esta opción anula la capacidad predeterminada de un cursor para actualizarse.
cursor_name
Es el nombre del cursor del servidor Transact-SQL definido. cursor_name debe cumplir con las reglas para identificadores.
LOCAL
Especifica que el alcance del cursor es local para el lote, procedimiento almacenado o disparador en el que se creó el cursor. El nombre del cursor solo es válido dentro de este ámbito. El cursor puede ser referenciado por variables de cursor locales en el lote, procedimiento almacenado o disparador, o un parámetro de procedimiento almacenado OUTPUT
. Se utiliza un parámetro OUTPUT
para devolver el cursor local al lote de llamada, al procedimiento almacenado o al activador, que puede asignar el parámetro a una variable de cursor para hacer referencia al cursor después del procedimiento almacenado. termina. El cursor se desasigna implícitamente cuando finaliza el lote, el procedimiento almacenado o el activador, a menos que el cursor se haya devuelto en un parámetro OUTPUT
. Si se devuelve en un parámetro OUTPUT
, el cursor se desasigna cuando la última variable que hace referencia a él se desasigna o sale del alcance.
GLOBAL
Especifica que el alcance del cursor es global para la conexión. Se puede hacer referencia al nombre del cursor en cualquier procedimiento almacenado o lote ejecutado por la conexión. El cursor solo se desasigna implícitamente al desconectarse.
Nota
Si no GLOBAL
o LOCAL
se especifica, el valor predeterminado está controlado por la configuración de la opción de base de datos de cursor local por defecto.
FORWARD_ONLY
Especifica que el cursor solo puede avanzar y desplazarse desde la primera a la última fila. FETCH NEXT
es la única opción de recuperación admitida. Todas las declaraciones de inserción, actualización y eliminación realizadas por el usuario actual (o confirmadas por otros usuarios) que afectan a las filas del conjunto de resultados son visibles a medida que se recuperan las filas.Sin embargo, debido a que el cursor no se puede desplazar hacia atrás, los cambios realizados en las filas de la base de datos después de que se obtuvo la fila no son visibles a través del cursor. Los cursores de solo avance son dinámicos de forma predeterminada, lo que significa que todos los cambios se detectan a medida que se procesa la fila actual. 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. Si bien los cursores de solo avance no admiten el desplazamiento hacia atrás, las aplicaciones pueden volver al comienzo del conjunto de resultados cerrando y volviendo a abrir el cursor. Si FORWARD_ONLY
se especifica sin STATIC
, KEYSET
o DYNAMIC
palabras clave, el cursor funciona como un cursor dinámico. Cuando no se especifica FORWARD_ONLY
ni SCROLL
, FORWARD_ONLY
es el valor predeterminado, a menos que las palabras clave STATIC
, KEYSET
o DYNAMIC
se especifican. Los cursores STATIC
, KEYSET
y DYNAMIC
están predeterminados en SCROLL
. A diferencia de las API de base de datos como ODBC y ADO, FORWARD_ONLY
es compatible con STATIC
, KEYSET
, y DYNAMIC
cursores Transact-SQL.
STATIC
Especifica que el cursor siempre muestra el conjunto de resultados como estaba cuando se abrió por primera vez, y hace una copia temporal de los datos que utilizará el cursor. Todas las solicitudes al cursor se responden desde esta tabla temporal en tempdb. Por lo tanto, las inserciones, actualizaciones y eliminaciones realizadas en las tablas base no se reflejan en los datos devueltos por las recuperaciones realizadas en este cursor, y este cursor no detecta los cambios realizados en la pertenencia, el orden o los valores del conjunto de resultados después de que se abre el cursor. . Los cursores estáticos pueden detectar sus propias actualizaciones, eliminaciones e inserciones, aunque no es necesario que lo hagan. Por ejemplo, suponga que un cursor estático obtiene una fila y luego otra aplicación actualiza esa fila. Si la aplicación recupera la fila del cursor estático, los valores que ve no cambian, a pesar de los cambios realizados por la otra aplicación. Se admiten todos los tipos de desplazamiento.
KEYSET
Especifica que la pertenencia y el orden de las filas en el cursor son fijos cuando se abre el cursor. El conjunto de claves que identifican de forma única las filas está integrado en una tabla en tempdb conocida como conjunto de claves. Este cursor proporciona funcionalidad entre un cursor estático y dinámico en su capacidad para detectar cambios. Como un cursor estático, no siempre detecta cambios en la pertenencia y el orden del conjunto de resultados. Como un cursor dinámico, detecta cambios en los valores de las filas en el conjunto de resultados. Los cursores controlados por conjuntos de claves son controlados por un conjunto de identificadores únicos (claves) conocido como conjunto de claves. Las claves se crean a partir de un conjunto de columnas que identifican de forma única las filas del conjunto de resultados. El conjunto de claves es el conjunto de valores clave de todas las filas devueltas por la declaración de consulta. Con los cursores controlados por conjuntos de claves, se crea y se guarda una clave para cada fila del cursor y se almacena en la estación de trabajo del cliente o en el servidor. Cuando accede a cada fila, la clave almacenada se utiliza para recuperar los valores de datos actuales de la fuente de datos. En un cursor controlado por un conjunto de claves, la pertenencia al conjunto de resultados se congela cuando el conjunto de claves está completamente poblado. A partir de entonces, las adiciones o actualizaciones que afecten a la membresía no forman parte del conjunto de resultados hasta que se vuelve a abrir. Los cambios en los valores de los datos (realizados por el propietario del conjunto de claves u otros procesos) son visibles cuando el usuario se desplaza por el conjunto de resultados:
- Si se elimina una fila, un intento de recuperar la fila devuelve un
@@FETCH_STATUS
de -2 porque la fila eliminada aparece como un espacio en el conjunto de resultados. La clave para la fila existe en el conjunto de claves, pero la fila ya no existe en el conjunto de resultados. - Las inserciones realizadas fuera del cursor (por otros procesos) son visibles solo si el cursor se cierra y se vuelve a abrir. Las inserciones realizadas desde el interior del cursor son visibles al final del conjunto de resultados.
- Las actualizaciones de valores clave desde fuera del cursor se asemejan a una eliminación de la fila anterior seguida de una inserción de la nueva fila. La fila con los nuevos valores no es visible y los intentos de recuperar la fila con los valores antiguos devuelven un
@@FETCH_STATUS
de -2. Los nuevos valores son visibles si la actualización se realiza a través del cursor especificando la cláusulaWHERE CURRENT OF
.
Nota
Si la consulta hace referencia al menos a una tabla sin un índice único, el cursor del conjunto de claves se convierte en un cursor estático.
DYNAMIC
Define un cursor que refleja todos los cambios de datos realizados en las filas en su conjunto de resultados a medida que se desplaza por el cursor y obtiene un nuevo registro, independientemente de si los cambios se producen desde el interior del cursor o por otros usuarios fuera del cursor. Por lo tanto, todas las declaraciones de inserción, actualización y eliminación realizadas por todos los usuarios son visibles a través del cursor.Los valores de los datos, el orden y la pertenencia de las filas pueden cambiar en cada recuperación. La opción de recuperación ABSOLUTE
no es compatible con cursores dinámicos. Las actualizaciones realizadas fuera del cursor no son visibles hasta que se confirman (a menos que el nivel de aislamiento de la transacción del cursor se establezca en UNCOMMITTED
). Por ejemplo, suponga que un cursor dinámico obtiene dos filas y otra aplicación luego actualiza una de esas filas y elimina la otra. Si el cursor dinámico recupera esas filas, no encontrará la fila eliminada, pero mostrará los nuevos valores para la fila actualizada.
FAST_FORWARD
Especifica un FORWARD_ONLY
, READ_ONLY
cursor con optimizaciones de rendimiento habilitadas. FAST_FORWARD
no se puede especificar si también se especifica SCROLL
o FOR_UPDATE
. Este tipo de cursor no permite modificaciones de datos desde el interior del cursor.
Nota
Tanto FAST_FORWARD
y FORWARD_ONLY
se puede usar en la misma DECLARE CURSOR
instrucción.
READ_ONLY
Evita las actualizaciones realizadas a través de este cursor. No se puede hacer referencia al cursor en una cláusula WHERE CURRENT OF
en una instrucción UPDATE
o DELETE
. Esta opción anula la capacidad predeterminada de un cursor para actualizarse.
SCROLL_LOCKS
Especifica que se garantiza que las actualizaciones colocadas o las eliminaciones realizadas a través del cursor se realizarán correctamente. SQL Server bloquea las filas a medida que se leen en el cursor para garantizar su disponibilidad para modificaciones posteriores. SCROLL_LOCKS
no se puede especificar si también se especifica FAST_FORWARD
o STATIC
.
OPTIMISTIC
Especifica que las actualizaciones colocadas o eliminaciones realizadas a través del cursor no se realizan correctamente si la fila se ha actualizado desde que se leyó en el cursor. SQL Server no bloquea las filas cuando se leen en el cursor. En su lugar, utiliza comparaciones de valores de columna de marca de tiempo, o un valor de suma de comprobación si la tabla no tiene columna de marca de tiempo, para determinar si la fila se modificó después de leerla en el cursor. Si se modificó la fila, el intento de actualización o eliminación posicionado falla. OPTIMISTIC
no se puede especificar si también se especifica FAST_FORWARD
.
TYPE_WARNING
Especifica que se envía un mensaje de advertencia al cliente cuando el cursor se convierte implícitamente del tipo solicitado a otro.
select_statement
Es una declaración SELECT estándar que define el conjunto de resultados del cursor. Las palabras clave COMPUTE
, COMPUTE BY
, FOR BROWSE
y INTO
no están permitidos dentro de select_statement de una declaración de cursor.
Nota
Puede usar una sugerencia de consulta dentro de una declaración de cursor; sin embargo, si también usa la cláusula FOR UPDATE OF
, especifique OPTION (<query_hint>)
después de FOR UPDATE OF
.
SQL Server convierte implícitamente el cursor a otro tipo si las cláusulas en select_statement entran en conflicto con la funcionalidad del tipo de cursor solicitado. Para obtener más información, consulte Conversiones de cursor implícitas.
Comentarios
DECLARE CURSOR
define los atributos de un cursor de servidor Transact-SQL, como su comportamiento de desplazamiento y la consulta utilizada para construir el conjunto de resultados en el que opera el cursor. La instrucción OPEN
completa el conjunto de resultados y FETCH
devuelve una fila del conjunto de resultados. La instrucción CLOSE
libera el conjunto de resultados actual asociado con el cursor. La instrucción DEALLOCATE
libera los recursos utilizados por el cursor.
La primera forma de la instrucción DECLARE CURSOR
usa la ISO sintaxis para declarar comportamientos del cursor. La segunda forma de DECLARE CURSOR
usa extensiones Transact-SQL que le permiten definir cursores usando los mismos tipos de cursor usados en las funciones de cursor de la API de base de datos de ODBC o ADO.
No se pueden mezclar las dos formas. Si especifica las palabras clave SCROLL
o INSENSITIVE
antes de la palabra clave CURSOR
, no podrá utilizar ninguna Palabras clave entre las palabras clave CURSOR
y FOR <select_statement>
. Si especifica alguna palabra clave entre las palabras clave CURSOR
y FOR <select_statement>
, no puede especificar SCROLL
o INSENSITIVE
antes de la palabra clave CURSOR
.
Si un DECLARE CURSOR
que usa la sintaxis Transact-SQL no especifica READ_ONLY
, OPTIMISTIC
, o SCROLL_LOCKS
, el valor predeterminado es el siguiente:
-
Si el
SELECT
no admite actualizaciones (permisos insuficientes, acceso a tablas remotas que no admiten actualizaciones, etc.), el cursor esREAD_ONLY
. -
STATIC
yFAST_FORWARD
cursores predeterminados aREAD_ONLY
. -
DYNAMIC
yKEYSET
cursores predeterminados aOPTIMISTIC
.
Los nombres de los cursores solo pueden ser referenciados por otras declaraciones Transact-SQL. Las funciones de la API de la base de datos no pueden hacer referencia a ellos. Por ejemplo, después de declarar un cursor, no se puede hacer referencia al nombre del cursor desde funciones o métodos OLE DB, ODBC o ADO. Las filas del cursor no se pueden recuperar mediante las funciones o métodos de recuperación de las API; las filas se pueden recuperar solo mediante declaraciones FETCH de Transact-SQL.
Después de que se ha declarado un cursor, estos procedimientos almacenados del sistema se pueden usar para determinar las características del cursor.
Procedimientos almacenados del sistema | Descripción |
---|---|
sp_cursor_list | Devuelve una lista de cursores actualmente visibles en la conexión y sus atributos. |
sp_describe_cursor | Describe los atributos de un cursor, como si es un cursor de solo avance o de desplazamiento. |
sp_describe_cursor_columns | Describe los atributos de las columnas en el conjunto de resultados del cursor. |
sp_describe_cursor_tables | Describe las tablas base a las que se accede por el cursor. |
Las variables se pueden usar como parte de la select_statement que declara un cursor. Los valores de las variables del cursor no cambian después de que se declara un cursor.
Permisos
Los permisos DECLARE CURSOR
predeterminados para cualquier usuario que tenga SELECT
permisos sobre las vistas, tablas y columnas utilizadas en el cursor.
Limitaciones y restricciones
No puede utilizar cursores o activadores en una tabla con un índice de almacén de columnas agrupado. Esta restricción no se aplica a los índices de almacén de columnas no agrupados; puede utilizar cursores y activadores en una tabla con un índice de almacén de columnas no agrupado.
Ejemplos
A. Usando cursor y sintaxis simples
El conjunto de resultados generado al abrir este cursor incluye todas las filas y todas las columnas de la tabla. Este cursor se puede actualizar, y todas las actualizaciones y eliminaciones se representan en búsquedas realizadas en este cursor. FETCH NEXT
es la única recuperación disponible porque la opción SCROLL
no se ha especificado.
B. Uso de cursores anidados para producir informes de salida
El siguiente ejemplo muestra cómo se pueden anidar los cursores para producir informes complejos. El cursor interno se declara para cada proveedor.