Estructuras de control SQL

Estructura condicional IF

La estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO), y ejecutar las operaciones contenidas en el bloque formado por BEGIN END.

Ejemplo de la estructura condicional IF.

DECLARE @Web varchar(100),
@diminutivo varchar(3)



SET @diminutivo = 'DJK'



IF @diminutivo = 'DJK'

BEGIN

PRINT 'www.devjoker.com';

END

ELSE

BEGIN

PRINT 'Otra Web (peor!)'

END

El IF admite el uso de subconsultas:

DECLARE @coPais int,
@descripcion varchar(255)
set @coPais = 5

set @descripcion = 'España'

IF EXISTS(SELECT * FROM PAISES

WHERE CO_PAIS = @coPais)
BEGIN

UPDATE PAISES

SET DESCRIPCION = @descripcion

WHERE CO_PAIS = @coPais

END

ELSE

BEGIN

INSERT INTO PAISES

(CO_PAIS, DESCRIPCION) VALUES

(@coPais, @descripcion)

END

Bucle WHILE

El bucle WHILE se repite mientras expresion se evalue como verdadero.

Es el único tipo de bucle del que dispone SQL.

Un ejemplo del bucle WHILE.

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

Con la instrucción BREAK.

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

WHILE con las subconsultas.

DECLARE @coRecibo int
WHILE EXISTS (SELECT *
FROM RECIBOS

WHERE PENDIENTE = 'S')
BEGIN

SET @coRecibo = (SELECT TOP 1 CO_RECIBO

FROM RECIBOS WHERE PENDIENTE = 'S')

UPDATE RECIBOS

SET PENDIENTE = 'N'

WHERE CO_RECIBO = @coRecibo

END

Estructura condicional CASE

La estructura condicional CASE permite evaluar una expresion y devolver un valor u otro.

Presentamos un Ejemplo de CASE.

DECLARE @Web varchar(100),
@diminutivo varchar(3)
SET @diminutivo = 'DJK'

SET @Web = (CASE @diminutivo

WHEN 'DJK' THEN 'www.devjoker.com';

WHEN 'ALM' THEN 'www.aleamedia.com';

ELSE 'www.devjoker.com';

END)

PRINT @Web

CASE permite subconsultas.

DECLARE @Web varchar(100),
@diminutivo varchar(3)
SET @diminutivo = 'DJK'



SET @Web = (CASE

WHEN @diminutivo = 'DJK' THEN (SELECT web

FROM WEBS

WHERE id=1)

WHEN @diminutivo = 'ALM' THEN (SELECT web

FROM WEBS

WHERE id=2)

ELSE 'www.devjoker.com';

END)

PRINT @Web

Estructura GOTO

La sentencia goto nos permite desviar el flujo de ejecución hacia una etiqueta. Fué muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema @@ERROR para el control de errores.

Actualmente, se desaconseja el uso GOTO, recomendandose el uso de TRY - CATCH para la gestion de errores.

EJEMPLO ESTRUCTURA GOTO

DECLARE @divisor int,
@dividendo int,
@resultado int

SET @dividendo = 100

SET @divisor = 0

SET @resultado = @dividendo/@divisor



IF @@ERROR > 0

GOTO error



PRINT 'No hay error'

RETURN

error:

PRINT 'Se ha producido una division por cero'

r

Control de errores en SQLUso de TRY CATCH    A partIr de la versión 2005, SQL Server proporciona el control de errores a través de las instrucciónes TRY y CATCH.   Estas nuevas instrucciones suponen un gran paso adelante en el control de errores en SQL Server, un tanto precario en las versiones anteriores.El siguiente ejemplo ilustra el uso de TRY - CATCH.BEGIN TRY    DECLARE @divisor int ,    @dividendo int,    @resultado int    SET @dividendo = 100    SET @divisor = 0    -- Esta linea provoca un error de division por 0    SET @resultado = @dividendo/@divisor    PRINT 'No hay error'  END TRY  BEGIN CATCH    PRINT 'Se ha producido un error'  END CATCH