Uso de bloques IF y WHILE para controlar el flujo del programa

Completado

Todos los lenguajes de programación incluyen elementos que le ayudan a determinar el flujo del programa o el orden en que se ejecutan las instrucciones. Aunque no tan destacado como lenguajes como C#, T-SQL proporciona un conjunto de palabras clave de control de flujo que puede usar para realizar pruebas lógicas y crear bucles que contengan las instrucciones de manipulación de datos de T-SQL. En esta lección, aprenderá a usar las palabras clave IF y WHILE de T-SQL.

Descripción del control T-SQL del lenguaje de flujo

SQL Server proporciona elementos del lenguaje que controlan el flujo de ejecución del programa dentro de lotes de T-SQL, procedimientos almacenados y funciones definidas por el usuario con múltiples sentencias. Estos elementos de control de flujo significan que puede determinar mediante programación si se deben ejecutar instrucciones y determinar mediante programación el orden de esas instrucciones que se deben ejecutar.

Estos elementos incluyen, pero no se limitan a:

  • SI... ELSE, que ejecuta código basado en una expresión booleana.
  • WHILE, que crea un bucle que se ejecuta mientras una condición es verdadera.
  • INICIO... FIN, que defina una serie de instrucciones T-SQL que deben ejecutarse juntas.
  • Otras palabras clave, por ejemplo, BREAK, CONTINUE, WAITFOR y RETURN, que se usan para admitir operaciones de control de flujo de T-SQL.

Este es un ejemplo de una instrucción IF:

IF OBJECT_ID('dbo.tl') IS NOT NULL
    DROP TABLE dbo.tl
GO

Uso de lógica condicional en los programas mediante IF...ELSE

La estructura IF...ELSE se usa en T-SQL para ejecutar condicionalmente un bloque de código basado en un predicado. La instrucción IF determina si se ejecuta la instrucción o el bloque siguiente (si se usa BEGIN...END). Si el predicado se evalúa como TRUE, se ejecuta el código del bloque. Cuando el predicado se evalúa como FALSE o UNKNOWN, el bloque no se ejecuta, a menos que se use la palabra clave ELSE opcional para identificar otro bloque de código.

En la siguiente instrucción IF, se pregunta a la base de datos si el OBJECT_ID IS NULL y, si es así, devuelve la instrucción PRINT. En este ejemplo, el objeto es NOT NULL y, por tanto, FALSE, lo que significa que no se ejecutará el código BEGIN/END. La instrucción PRINT solo se ejecutará si el objeto no existe en la base de datos.

USE TSQL;
GO
IF OBJECT_ID('HR.Employees') IS NULL --this object does exist in the sample database
BEGIN
    PRINT 'The specified object does not exist';
END;

Debido a las limitaciones con el código anterior solo con una instrucción IF, esto puede resultar confuso. La combinación de IF y ELSE proporciona más flexibilidad con la lógica del código y puede usar varias instrucciones ELSE. Con el uso de ELSE, tiene otra opción de ejecución cuando el predicado IF se evalúa como FALSE o UNKNOWN, como en el ejemplo siguiente:

IF OBJECT_ID('HR.Employees') IS NULL --this object does exist in the sample database
BEGIN
    PRINT 'The specified object does not exist';
END
ELSE
BEGIN
    PRINT 'The specified object exists';
END;

Dentro de las operaciones de manipulación de datos, el uso de IF con la palabra clave EXISTS puede ser una herramienta útil para comprobaciones de existencia eficaces, como en el ejemplo siguiente:

IF EXISTS (SELECT * FROM Sales.EmpOrders WHERE empid =5)
BEGIN
    PRINT 'Employee has associated orders';
END;

Descripción del bucle mediante instrucciones WHILE

La instrucción WHILE se usa para ejecutar código en un bucle basado en un predicado. Al igual que la instrucción IF, la instrucción WHILE determina si la siguiente instrucción o bloque (si BEGIN... End se usa) se ejecuta. El bucle continúa ejecutándose siempre que la condición se evalúe como TRUE. Normalmente, el bucle se controla con una variable probada por el predicado y manipulada en el cuerpo del propio bucle.

En el ejemplo siguiente, se usa la variable @empid en el predicado y se cambia su valor en el bloque BEGIN...END.

DECLARE @empid AS INT = 1, @lname AS NVARCHAR(20);
WHILE @empid <=5
   BEGIN
	SELECT @lname = lastname FROM HR.Employees
		WHERE empid = @empid;
	PRINT @lname;
	SET @empid += 1;
   END;

Para obtener opciones adicionales dentro de un bucle WHILE, puede usar las palabras clave CONTINUE y BREAK para controlar el flujo.