Skip to content

Estructuras de Control en Transact SQL

Permite evaluar una expresión booleana (SI - NO), y ejecutar las operaciones contenidas en el bloque formado por BEGIN y END

IF (--condición--)
BEGIN
-- Script a ejecutar
END
ELSEIF (---condición-)
BEGIN
-- Script a ejecutar
END
ELSE
BEGIN
-- Script a ejecutar
END
DECLARE @nombre varchar(100),
@apellido varchar(100)
SET @apellido = 'Gonzalez'
-- SET @apellido = 'Pardo'
SET @nombre ='Jaime'
If @apellido = 'Pardo'
BEGIN
PRINT @nombre
END
ELSE
BEGIN
PRINT 'El usuario no se llama Jaime'
END

En el ejemplo se declaran dos variables, nombre y apellido, y se les asigna un valor.

El condicional indica que si el valor del apellido equivale a la cadena ‘Pardo’, el programa procederá a imprimir el valor de la variable nombre. Por el contrario, si no se cumple la condición, el programa imprimirá la cadena ‘El usuario no se llama Jaime’.

En este caso el resultado sería el siguiente:

El usuario no se llama Jaime
DECLARE @razonSocial varchar(50),
@descripcion varchar(100),
@direccion varchar(50),
@tlf varchar(20),
@provincia varchar(50),
@sector varchar(50)
SET @razonSocial = 'Adiras'
SET @descripcion = 'Marca de ropa no deportiva'
SET @direccion = 'Avenida Nike de Puma, 4'
SET @tlf = '+34 556 775 773'
SET @provincia = 'Madriz'
SET @sector = 'Estafa'
IF EXISTS (SELECT * FROM Clientes WHERE razonSocial = @razonSocial)
BEGIN
DELETE FROM Clientes WHERE razonSocial = @razonSocial
END
ELSE
BEGIN
INSERT INTO Clientes (razonSocial, descripcion, direccion, tlf, provincia, sector)
VALUES (@razonSocial, @descripcion, @direccion, @tlf, @provincia, @sector)
END
SELECT * FROM Clientes WHERE razonSocial = @razonSocial

Este ejemplo es un poco más complejo e incluye una subconsulta en el condicional.

Se comprueba si existen registros en los que la razón social del cliente sea Adiras, y si existe, borra el registro del cliente con esa razón social. Por otro lado si no se cumple la condición creamos un registro en clientes con los datos de las variables declaradas al principio del script.

En este caso el resultado de la ejecución es el siguiente:

Untitled

(Esto se debe a la última línea del código que hace una consulta SELECT para comprobar la existencia del registro)


Permite evaluar una expresión y, en función del valor, devolverá un valor u otro.

CASE <expresion>
WHEN <valor_expresion> THEN <valor_devuelto>
WHEN <valor_expresion> THEN <valor_devuelto>
ELSE <valor_devuelto> -- Valor por defecto
END
DECLARE @nombre varchar(50),
@apellido varchar(50)
SET @apellido= 'González'
SET @nombre= (CASE
WHEN @apellido= 'González' THEN 'Jaime'
WHEN @apellido= 'Cano' THEN 'Pedro'
ELSE 'John'
END)
PRINT @nombre

En este ejemplo, se inician dos variables: nombre y apellido. se le asigna la cadena ‘González’ a la variable apellido y se inicia el CASE. En él, se comprueban tres posibilidades diferentes:

  1. Si el apellido es González, a la variable nombre se le da el valor Jaime.
  2. Si el apellido es Cano, a la variable nombre se le da el valor Pedro.
  3. Si ninguna de las condiciones anteriores se cumple, a la variable nombre se le da el valor de John.

Por último, se imprime por pantalla el resultado de la variable nombre.

Resultado:

Jaime
DECLARE @razonSocial varchar(50),
@sector varchar(50)
SET @sector = 'Servicio'
SET @razonSocial = (CASE
WHEN @sector = 'Estafa' THEN (SELECT razonSocial FROM Clientes WHERE ID = 3)
WHEN @sector = 'Servicio' THEN (SELECT razonSocial FROM Clientes WHERE ID = 5)
ELSE 'Adiras'
END)
PRINT @razonSocial

En este ejemplo, se usan subconsultas para devolver diferentes valores en función de una variable de sector. Si el sector es Estafa, se devuelve la razón social de un cliente específico determinado por su id (3). Si el sector es Servicio, se devuelve la razón social de otro cliente específico determinado por su id (5). Si no se cumple ninguna de estas condiciones, se devuelve el valor Aridas.

Resultado

Shuffledrive

Se repite una acción mientras que una expresión se evalúe como verdadera. Es el único bucle disponible en Transact SQL

WHILE <expresion>
BEGIN
      ...
END
DECLARE @contador int
SET @contador = 0
WHILE (@contador < 100)
BEGIN
SET @contador = @contador +1
IF EXISTS(SELECT ID FROM Clientes WHERE ID= @contador) SELECT * FROM Clientes WHERE ID=@contador
END

El código anterior crea una variable contador que irá aumentando su valor en uno cada vez que pase por el bucle hasta que llegue al valor 100. Por lo tanto, el bucle se repetirá 100 veces. En este caso, el bucle contiene, a su vez, un condicional IF que comprueba si existen registros de Clientes con id con el mismo valor que el contador actual. De esta forma se consiguen los registros de los 100 primeros clientes que existan. Teniendo en cuenta que los clientes eliminados no aparecerán y, por tanto, se presupone, no habrá 100 clientes en la vista, sino los clientes existentes en la base de datos del grupo de los 100 primeros clientes.

En este caso, las consultas se realizan de forma individual, por tanto, el resultado se compone de muchas vistas con una sola fila que contiene la información del cliente. Es por ello, que este ejemplo no es óptimo y sólo sirve de muestra. Hay que tener en cuenta que hay mejores formas de obtener este mismo resultado.

DECLARE @IdPedidos int
WHILE EXISTS (SELECT *
FROM Pedidos
WHERE codEstadoPedido = 1)
BEGIN
SET @IdPedidos = (SELECT TOP 1 ID FROM Pedidos WHERE codEstadoPedido = 1 )
UPDATE Pedidos SET codEstadoPedido = 3 WHERE ID = @IdPedidos
END

En el código del ejemplo anterior, mientras existan registros de pedidos con código de estado 1, hace un recorrido por todos los pedidos con código de estado 1 y se les asigna un código de estado 3. por tanto todos los pedidos con estado 1 pasarán a tener un estado 3


La instrucción CONTINUE se utiliza en un bucle WHILE para saltar a la siguiente iteración del bucle sin ejecutar el código que viene después de la instrucción CONTINUE en esa iteración.

DECLARE @contador int
SET @contador = 0
WHILE (@contador < 100)
BEGIN
SET @contador = @contador + 1
IF (@contador % 2 = 0)
CONTINUE ------------------------------------------------------------------
PRINT 'Iteracion del bucle ' + cast(@contador AS varchar)
END

En este ejemplo se imprimirán por pantalla los números impares del 1 al 100.

DECLARE @contador INT = 1
WHILE @contador <= 10
BEGIN
IF @contador = 5
BEGIN
SET @contador = @contador + 1
CONTINUE
END
PRINT @contador
SET @contador = @contador + 1
END

En este ejemplo se ejecuta un bucle que imprime números del 1 al 10. Con la instrucción CONTINUE, se comprueba con un condicional IF que si el valor del contador es 5, no se imprima. Por tanto este código imprimirá todos los números del 1 al 10 a excepción del 5.


La instrucción BREAK se utiliza en un bucle WHILE para salir del bucle de forma prematura.

DECLARE @contador int
SET @contador = 0
WHILE (1 = 1)
BEGIN
SET @contador = @contador + 1
IF (@contador % 50 = 0)
BREAK
PRINT 'Iteracion del bucle ' + cast(@contador AS varchar)
END

En este ejemplo, se inicia un contador en 0 y se crea un bucle WHILE infinito, al cumplirse siempre la condición de que 1 = 1. Pero dentro del bucle WHILE nos encontramos con un condicional IF que contiene un BREAK que establece que cuando se cumpla la condición de que el resto del contador/50 sea 0, termine el bucle y así, el programa. De esta forma, este código devolverá los números del 1 al 49.