Publicidad

Cursores en SQL Server


Por Alex el 14/11/2008 , Comentar el artículo

Comparte este artículo:        




Las sentencias SQL producen un conjunto de resultados que después procesamos desde nuestro programa, pero a veces es más útil que este conjunto de resultados se devuelve fila a fila y poderlo procesarlo en el mismo Stored Procedure.


Este artículo forma parte de "El poder del transact-SQL" pero es lo suficientemente interesante y siempre que utilicemos cursores tendremos que seguir estos pasos he decidido darle más relevancia y publicarlo otra vez.

Para definirlos de una forma clara se podría decir que son bucle que procesa un DataSet cuando recorres sus elementos con un for(), es decir, es un conjunto de registros que devuelve una sentencia Select.

Cómo funcionan los cursores:

Declararemos una variable de cursor con la sentencia:

Declare NombreCursor Cursor For

Después aplicaremos una sentencia Select para recuperar un conjunto de resultados y procesarlos, también podemos ejecutar la select desde otro SP con un Exec y abrimos el cursor con :

Open NombreCursor

y recuperamos la primera fila del cursor con FECH NEXT:

Fetch Next From NombreCursor Into @Var1, @Var2

donde Var1, Var2 ... Varn son las variables donde se dejaran los datos extraidos de la sentencia select, se han de poner tantas variables como campos se devuelvan de la sentencia select y en el mismo orden.

Una vez abierto el cursor comprobamos que todo funcione correctamente y recuperamos el resto de los datos para esto utilizamos un WHILE ...FETCH de la siguiente forma:

While @@FETCH_STATUS = 0
Begin
........
Fetch Next From NombreCursor
Into @Var1, @Var2
End


@@FETCH_STATUS

puede tener los siguientes valores dependiendo del resultado de la consulta:

Valor - definición
0  - La instrucción FETCH se ejecutó correctamente.
-1   - La instrucción FETCH ha finalizado con error o la fila estaba más allá del conjunto de resultados.
-2   - Falta la fila recuperada.

y por ultimo cerraremos el cursor y liberamos los recurso utilizados.

Ejemplo.

Este ejemplo es uno muy común que se encuentra en todas las webs "recordar contraseña", ¿ quién no ha olvidado la contraseña alguna vez ?.

Supongamos que un usuario se ha dado de alta mas de una vez con el mismo email y diferentes logins, bien, con este Stored Procedures con cursores podremos enviarle todos sus usuarios con sus passwords en un mismo mail. La explicación de SP está entre el código en color verde, si queréis probar el SP solo teneis que hacer Copy & Paste.

Create Procedure recordar_password

-- Recibimos desde un programa exterior el mail
-- del usuario al que se le ha de enviar sus datos

@email varchar(250)
As

-- Declaramos la variable a utilizar en el SP
-- sMensaje, es el mensaje que enviaremos con los datos

Declare @sMensaje varchar(1000)

-- Declaramos variable para el retorno de carro y el salto de linea
-- y le asignamos los valores

Declare @CRLF varchar(100)
Select @CRLF = Char(10) + Char(13) + Char(10) + Char(13)

-- Declaramos las variables que recogeran del cursor los
-- logins y passwords de un usuario

Declare @Login varchar(20)
Declare @Pass varchar(20)

-- Declaramos el cursor para hacer el bucle para
-- extraer los logins y passwords de un usuario concreto

Declare CursorUsuarios Cursor For

-- Realizamos la Select para extraer los datos del usuario

Select Login, contrasena From pr_usuarios where email = @email

-- Abrimos el cursor

Open CursorUsuarios

-- Devolvemos la primera fila de resultados del cursor en las
-- variables que hemos declarado anteriormente

Fetch Next From CursorUsuarios
Into @Login, @Pass

-- Miramos que la instrucción FETCH se ejecutó correctamente.

if @@FETCH_STATUS = 0
Begin

-- Iniciamos la parte del mensaje que enviaremos al usuario

Select @sMensaje = 'Su Login y Password. '
Select @sMensaje = @sMensaje + @CRLF

-- Mientras hay resultados para procesar

While @@FETCH_STATUS = 0
Begin

-- Creamos el mensake con todos los logins y passwords
-- que el usuario tiene.

Select @sMensaje = @sMensaje + 'Sus datos de acceso son:' + Char(13)
Select @sMensaje = @sMensaje + ' Login : ' + @Login + Char(13)
Select @sMensaje = @sMensaje + ' Password : ' + @Pass + @CRLF
Select @sMensaje = @sMensaje + ' ------------------------' + @CRLF

-- Recuperamos la siguiente fila

Fetch Next From CursorUsuarios
Into @Login, @Pass
End

-- Una vez recuperadas todas las filas para ese usuario
-- se envia un mail con sus datos

Exec master.dbo.xp_sendmail
@recipients = @email,
@subject = 'Sus Datos de acceso',
@message = @sMensaje
End

-- Cerramos el cursor

Close CursorUsuarios

-- Quita la referencia al cursor y el SQL Server libera la
-- estructura de datos ocupada por el cursor.

Deallocate CursorUsuarios

Y esto es todo, feliz programming!!
Saludos
Alex.


Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN

ARCHIVO

Publicidad

.