2011-03-01 10 views
8

Estoy usando un cursor.Definición del cursor de cambio TSQL

DECLARE @column1 NVARCHAR(MAX); 

DECLARE cursor_name CURSOR FOR 
    SELECT c1 
    FROM table_name; 

OPEN cursor_name; 
FETCH cursor_name INTO @column1; 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    FETCH cursor_name INTO @column1; 
END 

CLOSE cursor_name; 
DEALLOCATE cursor_name; 

Ahora mi pregunta es, ¿puedo cambiar la definición del cursor cursor_name 's después de usarlo? Me refiero a algo similar a:

DECLARE cursor_name CURSOR FOR 
    SELECT c2 
    FROM table_name2; 

Utilizando el mismo nombre del cursor cursor_name, pero se cambia el defination. Si esto es posible, ¿cómo hacer esto?

Gracias.

Respuesta

10

Yes it's possible, pero tiene que ser después de su DEALLOCAR. ¿Has probado esto y no funciona o algo así?

Es posible que también desee ver si realmente necesita un cursor. Dañan el rendimiento y el SQL que los usa a menudo se puede reescribir sin ellos.

Eche un vistazo a this article que explica cómo hacerlo. Utilizan la sintaxis DECLARE/SET menos común para declarar un cursor (poco común en mi mundo al menos). Aquí está el ejemplo que proporcionan:

USE pubs 
GO 
DECLARE @MyCursor CURSOR 
SET @MyCursor = CURSOR LOCAL SCROLL FOR 
SELECT * FROM titles 

DEALLOCATE @MyCursor 

SET @MyCursor = CURSOR LOCAL SCROLL FOR 
SELECT * FROM sales 
GO 
4

Evitando la discusión sobre si un cursor es necesario o no, desde un punto de vista puramente técnico, una vez que el cursor está cerrado y desasignado, puede volver a utilizar el nombre de nuevo.

-1

Corrección a Abe Miessler engañosa comentarios sobre el desempeño del cursor:

cursores Transact-SQL son extremadamente eficiente cuando estén contenidos en los procedimientos almacenados y disparadores . Esto se debe a que todo se compila en plan de una ejecución en el servidor y no hay tráfico de red asociado con filas ir a buscar

Lo que es malo para el rendimiento es llamar repetidamente a un cursor global para la próxima fila desde fuera de un proceso almacenado. Es mejor utilizar las funciones de procesamiento por lotes de aplicaciones del cliente para reducir los viajes de ida y vuelta.

Puede utilizar los cursores de Transact-SQL en aplicaciones mediante el uso de FETCH y unión cada columna devuelta por el FETCH a una variable de programa. El FETCH de Transact-SQL no admite lotes, sin embargo, esta es la forma menos eficiente de devolver datos a una aplicación. La obtención de cada fila requiere una ida y vuelta al servidor. Es más eficiente usar la funcionalidad del cursor incorporada en las API de base de datos que admiten buscando lotes de filas.

Cuestiones relacionadas