2010-11-22 47 views
7

En T-SQL un cursor puede ser declarada de dos maneras (que yo sepa):ventajas sobre el uso variable de cursor en SQL Server (declaran cursor @cn)

  1. declare CursorName cursor for ...
  2. declare @CursorName cursor

Estaba realizando algunas pruebas y noté que la creación de una variable de cursor no agregará una entrada al resultado de sp_cursor_list.

¿Hay alguna ventaja/desventaja en el uso del segundo enfoque desde el punto de vista del rendimiento, la utilización de los recursos, etc.?

PS: Soy consciente de posibles problemas de rendimiento del cursor. No estoy pidiendo una comparación en cursores basado en conjunto. O cursor vs while con la variable temp/table.

+3

Si el rendimiento es una consideración, probablemente no debería estar utilizando los cursores :) – JNK

+0

Si publica código o XML, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "código" (101 010) en la barra de herramientas del editor para formatear y resaltar la sintaxis. –

+1

Si ** debes ** usar un cursor, siempre trataré de usar 'DECLARE cursor_name CURSOR FAST_FORWARD' si alguna vez puedo. Pero su mejor optimización de rendimiento sería evitar los cursores si es posible. –

Respuesta

4

Por lo que he leído, el propósito de la variable del cursor es poder usarlo como una variable de salida en el proceso almacenado, lo que le permite enviar los datos en el cursor a otro proceso de control. No lo he intentado así que no sé exactamente cómo funcionaría, pero eso es lo que obtengo leyendo Libros en línea. Me sorprendería si hay alguna diferencia de rendimiento medible y, desde luego, no la mejora que podría obtener al no usar un cursor en primer lugar. Si no planea usarlo como una variable de salida, le sugiero que quedarse con la definición de cursor más común podría hacer que el código sea más fácil de mantener.

Dicho esto, hay muy, muy pocos casos en los que realmente se necesita un cursor.

0

Intentaré evitar los cursers tanto como sea posible (al menos si piensas en el rendimiento). Intenta crear una solución basada en conjunto para tu problema. Por lo general, serán procesados ​​mucho más rápido que una solución basada en cursor.

+1

Aunque estoy de acuerdo, esto realmente no aborda su pregunta. – JNK

4

Otra ventaja es utilizar la sintaxis DECLARE @local_variable CURSOR que acabo de descubrir.

La ventaja se produce cuando un procedimiento almacenado llama a otro y ambos procedimientos tienen cursores abiertos al mismo tiempo. Si DECLARE cursor_name CURSOR se utiliza para definir los cursores, y ambos procedimientos utilizan el mismo cursor_name, a continuación, se obtiene

Msg 16915: Un cursor con el 'cursor_name' nombre ya existe.

Por otro lado, si DECLARE @local_variable CURSOR se utiliza para definir los cursores en el padre y procedimientos almacenados niño, entonces @local_variable es local a cada procedimiento y no hay conflicto. Para aquellos que no han utilizado este método antes, aquí hay un ejemplo, usando @C como la variable local:

DECLARE @C AS CURSOR; 

SET @C = CURSOR FOR SELECT ...; 

OPEN @C; 

FETCH NEXT FROM @C INTO ...; 

...

Cuestiones relacionadas