Estructuras de Control en Transact SQL
🟦 Condicional IF
Section titled “🟦 Condicional IF”Permite evaluar una expresión booleana (SI - NO), y ejecutar las operaciones contenidas en el bloque formado por BEGIN y END
Estructura
Section titled “Estructura”IF (--condición--)BEGIN -- Script a ejecutarENDELSEIF (---condición-)BEGIN -- Script a ejecutarENDELSEBEGIN -- Script a ejecutarENDEjemplo 1
Section titled “Ejemplo 1”DECLARE @nombre varchar(100), @apellido varchar(100)
SET @apellido = 'Gonzalez'-- SET @apellido = 'Pardo'SET @nombre ='Jaime'
If @apellido = 'Pardo' BEGIN PRINT @nombre ENDELSE BEGIN PRINT 'El usuario no se llama Jaime' ENDEn 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 JaimeEjemplo 2
Section titled “Ejemplo 2”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 ENDELSE BEGIN INSERT INTO Clientes (razonSocial, descripcion, direccion, tlf, provincia, sector) VALUES (@razonSocial, @descripcion, @direccion, @tlf, @provincia, @sector) END
SELECT * FROM Clientes WHERE razonSocial = @razonSocialEste 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:

(Esto se debe a la última línea del código que hace una consulta SELECT para comprobar la existencia del registro)
🟨 Condicional CASE
Section titled “🟨 Condicional CASE”Permite evaluar una expresión y, en función del valor, devolverá un valor u otro.
Estructura
Section titled “Estructura”CASE <expresion> WHEN <valor_expresion> THEN <valor_devuelto> WHEN <valor_expresion> THEN <valor_devuelto> ELSE <valor_devuelto> -- Valor por defectoENDEjemplo 1
Section titled “Ejemplo 1”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 @nombreEn 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:
- Si el apellido es González, a la variable nombre se le da el valor Jaime.
- Si el apellido es Cano, a la variable nombre se le da el valor Pedro.
- 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:
JaimeEjemplo 2
Section titled “Ejemplo 2”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 @razonSocialEn 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🔁 Bucle WHILE
Section titled “🔁 Bucle WHILE”Se repite una acción mientras que una expresión se evalúe como verdadera. Es el único bucle disponible en Transact SQL
Estructura
Section titled “Estructura”WHILE <expresion>BEGIN ...ENDEjemplo 1
Section titled “Ejemplo 1”DECLARE @contador intSET @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 ENDEl 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.
Ejemplo 2
Section titled “Ejemplo 2”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 ENDEn 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
⏭️ CONTINUE
Section titled “⏭️ CONTINUE”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.
Ejemplo 1
Section titled “Ejemplo 1”DECLARE @contador intSET @contador = 0WHILE (@contador < 100) BEGIN SET @contador = @contador + 1 IF (@contador % 2 = 0) CONTINUE ------------------------------------------------------------------ PRINT 'Iteracion del bucle ' + cast(@contador AS varchar) ENDEn este ejemplo se imprimirán por pantalla los números impares del 1 al 100.
Ejemplo 2
Section titled “Ejemplo 2”DECLARE @contador INT = 1
WHILE @contador <= 10BEGIN IF @contador = 5 BEGIN SET @contador = @contador + 1 CONTINUE END
PRINT @contador SET @contador = @contador + 1ENDEn 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.
🛑 BREAK
Section titled “🛑 BREAK”La instrucción BREAK se utiliza en un bucle WHILE para salir del bucle de forma prematura.
Ejemplo 1
Section titled “Ejemplo 1”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) ENDEn 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.