OPEN (Transact-SQL)
Abre un cursor del servidor Transact-SQL y lo llena ejecutando la instrucción Transact-SQL especificada en la instrucción DECLARE CURSOR o SET cursor_variable.
Convenciones de sintaxis de Transact-SQL
Sintaxis
OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }
Argumentos
GLOBAL
Especifica que cursor_name hace referencia a un cursor global.cursor_name
Es el nombre de un cursor declarado. Si existe un cursor global y uno local con el nombre cursor_name, cursor_name hace referencia al cursor global si se especifica GLOBAL; en caso contrario, cursor_name hace referencia al cursor local.cursor_variable_name
Es el nombre de la variable cursor que hace referencia a un cursor.
Comentarios
Si se declara el cursor con la opción INSENSITIVE o STATIC, OPEN crea una tabla temporal para mantener el conjunto de resultados. OPEN produce un error si el tamaño de cualquier fila en el conjunto de resultados excede el tamaño máximo de fila para las tablas de SQL Server. Si el cursor se declara con la opción KEYSET, OPEN crea una tabla temporal para mantener el conjunto de claves. Las tablas temporales se almacenan en tempdb.
Después de abrir un cursor, utilice la función @@CURSOR_ROWS para recuperar el número de filas habilitadas en el último cursor abierto.
[!NOTA]
SQL Server no es compatible con la generación asincrónica de cursores de Transact-SQL estáticos o controlados por conjuntos de claves. Las operaciones de cursor de Transact-SQL como OPEN o FETCH se procesan por lotes, por lo que la generación asincrónica de cursores de Transact-SQL no es necesaria. SQL Server continúa admitiendo los cursores de servidor de la interfaz de programación de aplicaciones (API) o controlados por conjuntos de claves asincrónicos en los que OPEN de baja latencia es un problema, debido a los trayectos de ida y vuelta al cliente para cada operación del cursor.
Ejemplos
Este ejemplo abre un cursor y busca todas sus filas.
DECLARE Employee_Cursor CURSOR FOR
SELECT LastName, FirstName
FROM AdventureWorks2012.HumanResources.vEmployee
WHERE LastName like 'B%';
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;