IF, ELSE y BEGIN...END: decidir qué instrucciones ejecutar
Algunos procesos deben seguir rutas distintas según exista información, un parámetro sea válido o una operación haya afectado filas. IF evalúa una condición y decide qué instrucción o bloque se ejecutará.
Esta construcción controla el flujo del lote o procedimiento. No sustituye a CASE, que calcula un valor para cada fila de una consulta.
Sintaxis
IF Condicion
BEGIN
-- Instrucciones cuando la condición es verdadera.
END
ELSE
BEGIN
-- Instrucciones cuando la condición es falsa.
END;
BEGIN...END agrupa varias instrucciones. Aunque una rama tenga solo una, conservar el bloque puede evitar errores cuando el código crece.
Ejemplo: comprobar existencia
DECLARE @IdCliente INT = 3;
IF EXISTS
(
SELECT 1
FROM dbo.Pedido AS p
WHERE p.IdCliente = @IdCliente
)
BEGIN
SELECT 'El cliente tiene pedidos.' AS Resultado;
END
ELSE
BEGIN
SELECT 'El cliente no tiene pedidos.' AS Resultado;
END;
EXISTS produce la condición. IF determina cuál de las dos consultas se ejecuta.
Validar antes de continuar
DECLARE @Cantidad INT = 0;
IF @Cantidad <= 0
BEGIN
THROW 50001, 'La cantidad debe ser mayor que cero.', 1;
END;
SELECT 'La cantidad es válida.' AS Resultado;
Al lanzar el error, el lote no continúa como si el valor fuera aceptable. En un procedimiento real, el número y mensaje deberían seguir una convención conocida por sus consumidores.
Varias condiciones
IF @Cantidad > 0 AND @Cantidad <= 100
BEGIN
SELECT 'Cantidad dentro del límite.' AS Resultado;
END;
Los operadores siguen las mismas reglas de precedencia que en WHERE. Los paréntesis ayudan cuando combinamos AND, OR y NOT.
IF frente a CASE
Utilizamos IF cuando queremos ejecutar bloques diferentes. Utilizamos CASE dentro de una consulta cuando cada fila necesita producir un valor según una condición.
No podemos utilizar CASE para ejecutar arbitrariamente un INSERT o un SELECT completo; es una expresión, no un bloque de control.
Qué conviene comprobar
Una condición basada en @@ROWCOUNT debe evaluarse inmediatamente después de la instrucción que queremos medir. Cualquier sentencia intermedia puede cambiar el valor.
También evitamos cadenas extensas de IF...ELSE cuando una tabla de reglas, una restricción o una operación basada en conjuntos representaría mejor el problema.
Relacionado con
- Operadores lógicos: construyen la condición evaluada.
EXISTS: comprueba si una consulta encuentra filas.CASE: devuelve valores condicionales dentro de una expresión.TRY/CATCH: desvía el flujo cuando ocurre un error.