DECLARE CURSOR (Transact-SQL) (Español)

  • 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áusula WHERE 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 es READ_ONLY.

  • STATIC y FAST_FORWARD cursores predeterminados a READ_ONLY.

  • DYNAMIC y KEYSET cursores predeterminados a OPTIMISTIC .

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.

Ver también

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *