Uso de la instrucción WHILE en Procedimientos almacenados

Después de leer este artículo, comprenderá los conceptos básicos de usar la instrucción WHILE para escribir un bucle dentro de un procedimiento almacenado.

Todos los ejemplos de esta lección se basan en Microsoft SQL Server Management Studio y las bases de datos de ejemplo AdventureWorks y WideWorldImporters. Puede comenzar a usar estas herramientas gratuitas con mi Guía Introducción a SQL Server.

WHILE, BREAK y CONTINUE

La instrucción WHILE se utiliza para ejecutar repetidamente un bloque de instrucciones SQL. El bloque se ejecuta repetidamente si la condición de la instrucción WHILE es verdadera.

El formato general de las sentencias WHILE es:

WHILE conditionBEGIN -- code block run when condition is TRUEEND

Si te encuentras repitiendo sentencias, especialmente aquellas que caen en un patrón, entonces, existe la posibilidad de que puedas usar una sentencia WHILE para guardar algo de escritura y hacer que tu programa sea más divertido de escribir.

Por ejemplo, supongamos que necesita crear una tabla temporal que contenga la fecha de inicio de cada semana. Por supuesto, podríamos escribir 52 declaraciones de INSERCIÓN individuales, ¡pero eso es aburrido!

INSERT INTO @myTable VALUES (0, 12/31/2017)INSERT INTO @myTable VALUES (1, 01/07/2018)INSERT INTO @myTable VALUES (2, 01/14/2018)…INSERT INTO @myTable VALUES (52, 12/30/2018 )

En su lugar, use el comando WHILE para recorrer las 52 semanas, insertando la fecha de inicio de cada semana en la tabla. Puedes ver cómo hacemos esto en el siguiente ejemplo.

--Setup VariablesDECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'--Loop Through weeksWHILE @n <= 52BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1END--Show ResultsSELECT WeekNumber, DateStartingFROM @myTable

Lo que hace que este tick sea la función DATEADD. Observe que DATEADD (wk, @n, @firstWeek) agrega una semana de trabajo de días a nuestra fecha de @firstWeek. En la primera iteración añade 0 semanas. En la segunda iteración, @n = 1, por lo que agrega 1 semana, y así sucesivamente.

Aquí hay algunos puntos más:

  • La instrucción WHILE prueba la variable @n. Si es < = 52, se puede ejecutar el bloque de programa (verde).
  • Cada vez que se ejecuta el bloque, la variable @n se incrementa en uno. Esto es importante. Si esto no sucediera, el valor nunca sería mayor que 52, y nuestro programa ejecutaría el bloque de código, una y otra vez, sin fin. Esto se llama bucle infinito.
  • Refuerzo a #2 arriba! Es importante que su bucle tenga una condición final. En nuestro caso, nos aseguramos de que la variable @n se incremente, y que eventualmente sea mayor que 52.
  • Utilizamos el valor @n para «manejar» el valor de fecha. Al agregar semanas a nuestra fecha base, @firstWeek, podemos calcular las fechas posteriores de la semana de inicio.

Aquí están los resultados:

MIENTRAS que los resultados de ejemplo de instrucción

Como puede ver, a partir de este simple bucle, pudimos crear algunos datos interesantes, y fue más divertido hacer wo usando funciones de fecha, que «codificar» la instrucción. El uso de bucles es muy poderoso.

Usando BREAK para cortocircuitar un bucle

La instrucción BREAK se usa para salir forzosamente del bloque de código de una instrucción WHILE.

En el siguiente ejemplo hemos alterado la instrucción WHILE. Ahora usa la instrucción BREAK, que está coloreada en verde.

Hay dos cambios:

  1. La condición de instrucción WHILE siempre se evalúa como VERDADERA, ya que @n siempre es mayor o igual a cero.
  2. La instrucción IF prueba la condición end y, cuando es TRUE, ejecuta BREAK.
DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAKEND

La instrucción BREAK es útil para finalizar la ejecución. Si las sentencias WHILE están anidadas, entonces se sale del bucle más interno.

Utilizando CONTINUE para restablecer un bucle

La instrucción CONTINUE reinicia el bloque de código de una instrucción WHILE. Cualquier declaración encontrada después de CONTINUAR no se ejecuta.

Por ejemplo, a continuación, la instrucción PRINT nunca se ejecuta.

DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAK ELSE CONTINUE PRINT ‘I Never get executed’END

La razón es que la instrucción BREAK fuerza una SALIDA, o cuando se ejecuta CONTINUE, el bucle se restablece al principio del bloque.



Deja una respuesta

Tu dirección de correo electrónico no será publicada.