2009-08-19 15 views
7

estoy usando SQL Server para crear procedimientos almacenados, y estoy usando los cursores a bucle a través de una instrucción de selecciónCómo acceder a las columnas cursor sin FETCH .. EN

estoy definiendo el cursor de la siguiente manera:

DECLARE @c_col1 varchar(max); 
DECLARE @c_col2 varchar(max); 

DECLARE c as CURSOR FOR 
SELECT col1, col2 
FROM table; 

OPEN c; 
FETCH NEXT FROM c INTO 
@c_col1, @c_col2; 

SELECT @c_col1, @c_col2; 

¿hay una manera de acceder a las columnas del cursor sin necesidad de declarar las variables para cada columna y usar INTO en la cláusula FETCH? En otras palabras, es posible el uso de:

DECLARE c as CURSOR FOR 
SELECT col1, col2 
FROM table; 

OPEN c; 
FETCH NEXT FROM c; 

SELECT c.col1, c.col2; 
+0

¿Por qué necesita usar cursores? Realmente debería intentar encontrar una alternativa basada en conjuntos utilizando SQL ya que esto es lo que las bases de datos son buenas para el procesamiento. A menudo, el código del cursor es mucho más lento que el SQL equivalente. – pjp

+2

@pjp, a veces los cursores son útiles para ejecutar una lógica compleja fila por fila, a menudo llamando a un procedimiento almacenado para cada fila devuelta. Además, si necesita hacer algo como eliminar unos pocos millones de filas, una única consulta basada en conjuntos puede bloquear su base de datos durante mucho tiempo. Eliminar una fila a la vez con un cursor lleva mucho más tiempo, pero permite que la base de datos respire mientras está sucediendo. –

+0

puede recorrer y procesar datos, sin un cursor. Puede obtener mejoras de rendimiento masivo reemplazando cursores con operaciones basadas en conjunto. Sin embargo, he reemplazado el uso de cursores, pero seguí haciendo un bucle (porque realmente era necesario) y todavía he visto grandes ganancias de rendimiento. –

Respuesta

1

no, usted tiene que hacerlo de esa manera si desea almacenar los valores del cursor en variables locales en lugar de devolverlos de nuevo al cliente.

+0

del código de OP, están devolviendo los valores como un conjunto de reslt de 1 fila de dos columnas –

0

si esto es todo su porcedure (a la derecha de la pregunta OP):

DECLARE @c_col1 varchar(max); 
DECLARE @c_col2 varchar(max); 

DECLARE c as CURSOR FOR 
SELECT col1, col2 
FROM table; 

OPEN c; 
FETCH NEXT FROM c INTO 
@c_col1, @c_col2; 

SELECT @c_col1, @c_col2; 

a continuación, puedes hacer lo siguiente para devolver un conjunto de resultados de las dos columnas, ningún cursor necesaria:

SELECT top 1 col1, col2 
FROM table; 
Cuestiones relacionadas