IF, ELSE, WHILE en Stored Procedures

Clase 13 de 26Curso de Gestión de Bases de Datos con SQL Server

Resumen

Cuando un procedimiento almacenado solo ejecuta consultas, no es más que una consulta guardada. El verdadero poder aparece al incorporar variables, parámetros de salida y control de flujo con IF, ELSE y WHILE. Es en ese momento cuando SQL Server se comporta como un lenguaje de programación completo, capaz de tomar decisiones y comunicar resultados de forma inteligente.

¿Cómo se declaran y asignan variables en TSQL?

Declarar variables es el primer paso para darle lógica a un procedimiento almacenado. En TSQL, toda variable debe ir precedida por el símbolo arroba (@), que indica que el valor vive "dentro del motor" [01:30]. Cada variable requiere un tipo de dato explícito:

  • @contador como entero.
  • @mensaje como texto.
  • @fechaHoy con la fecha actual.
  • @totalVentas como DECIMAL(18,2).

Una vez declaradas, se les puede asignar un valor por defecto. Por ejemplo, SET @contador = @contador + 1 hace que cada vez que se invoque, el contador se incremente en uno [02:20]. Esa es la base de cualquier iteración.

¿Cómo asignar valores desde una consulta?

Las variables también pueden recibir valores directamente desde un SELECT. En el ejemplo, @totalVentas se alimenta con la suma del total de pedidos donde el estado sea "completado" y el año coincida con el deseado [03:00].

sql SET @totalVentas = ( SELECT SUM(Total) FROM Pedidos WHERE Estado = 'Completado' AND YEAR(FechaPedido) = 2024 );

El resultado se muestra con PRINT, una instrucción que imprime texto en la pestaña Mensajes de Management Studio. Al ejecutar, el motor devuelve: "Total de ventas del año seleccionado: 114,902.98" [04:10].

¿Cómo funcionan IF y ELSE dentro de un procedimiento almacenado?

Incorporar variables dentro de un SP permite agregarle lógica de negocio real. El procedimiento ConsultarVentasPorPais recibe @codigoPais, @fechaInicio, @fechaFin y un parámetro de salida llamado @hayResultados [04:50].

El flujo funciona así:

  • Se declara @conteoResultados como entero.
  • Se asigna el conteo de registros que cumplen los filtros.
  • Se evalúa con IF.

sql IF @conteoResultados = 0 BEGIN PRINT 'No se encontraron ventas para ' + @codigoPais + ' en el período indicado'; SET @hayResultados = 0; END ELSE BEGIN -- Devuelve el SELECT completo SET @hayResultados = 1; END

El IF es la evaluación: comprueba si una condición se cumple [06:40]. El ELSE representa "de lo contrario", es decir, qué hacer cuando la condición no se cumple. El END cierra cada bloque lógico.

Al probar con Argentina en 2024, el SP devuelve seis pedidos y confirma que hay resultados. Pero al cambiar el año a 2025, no encuentra datos y el mensaje aparece en la pestaña Mensajes de Management Studio [07:50], no en la pestaña de resultados tabulares.

¿Qué diferencia hay entre resultados y mensajes en Management Studio?

Los datos tabulares que devuelve un SELECT aparecen en la pestaña Resultados. Los textos generados con PRINT se muestran en la pestaña Mensajes. Entender esta separación es fundamental para depurar procedimientos almacenados.

¿Qué es el WHILE y cómo procesa datos de forma secuencial?

El WHILE permite ejecutar un bloque de código de forma iterativa hasta que una condición deje de cumplirse [08:40]. A diferencia de ejecutar todo al mismo tiempo, el WHILE procesa elemento por elemento.

sql WHILE @contador <= @totalPaises BEGIN -- Ejecuta la consulta donde la fila = @contador SET @contador = @contador + 1; END

El mecanismo es claro:

  • @totalPaises almacena el conteo total de países distintos.
  • @contador arranca en uno y se incrementa tras cada ciclo.
  • El bloque se ejecuta hasta que el contador alcance el total de países [10:15].
  • En el WHERE, se filtra por fila = @contador, procesando cada país de forma secuencial.

Al ejecutar, Management Studio devuelve en la pestaña de mensajes el total de venta acumulada para cada país, uno por uno. Si hay nueve países, el ciclo se ejecuta exactamente nueve veces.

Es importante tener precaución: un WHILE mal construido puede generar un loop infinito que consuma recursos innecesarios del servidor [11:00]. Siempre hay que asegurar que la condición de salida se cumpla eventualmente, incrementando el contador con SET @contador = @contador + 1 al final de cada iteración.

Con estas herramientas, un procedimiento almacenado deja de ser una simple consulta guardada y se convierte en un componente con capacidad de decisión y procesamiento iterativo. Practica modificando el SP para que devuelva una advertencia de "Período de alto volumen" cuando las ventas superen el millón, y comparte tus resultados en los comentarios.