sábado, 11 de julio de 2015

Receta T-SQL No. 2-8: Ir a un Punto de Procesamiento en un Batch T-SQL

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En T-SQL tenemos la posibilidad de programar un conjunto de sentencias que se ejecuten rutinariamente. Las sentencias pueden requerir una lógica de control de flujo de ejecución basada en condiciones y saltos a puntos de procesamiento específicos; es por esta razón que dedicaremos nuestro esfuerzo en comprender cómo T-SQL provee los mecanismos lógicos para permitir seguir este enfoque de ejecución.

1. Problema

Se requiere programar un batch T-SQL que permita pasar el control del flujo de ejecución a un punto específico de la lógica de implementación.

2. Solución

T-SQL cuenta con la sentencia GOTO para solucionar este problema. GOTO pasa el control de flujo de ejecución a un punto marcado por una etiqueta con un nombre único y de donde se continuará con la ejecución del batch.

3. Discusión de la Solución

Al usar GOTO [2] omitimos la ejecución de las sentencias que se hallen entre esta sentencia y el punto de salto con el nombre de la etiqueta correspondiente, es por esta razón que debemos tener cuidado con el excesivo uso de esta construcción.

Para declarar una etiqueta seguimos esta sintaxis:

nombre_etiqueta:

Notemos los dos puntos (:) después del nombre de la etiqueta: es requerido sintácticamente. A partir de los dos puntos seguidos escribiremos las sentencias T-SQL que se ejecutarán después de haber dado el salto con la sentencia GOTO.

IF (SELECT ...) = 'RealizarPago'
    GOTO calcular_salario
    -- sentencia 1
    -- sentencia 2
    -- sentencia 3
    -- ...
    -- sentencia n
calcular_salario:
    -- otras_sentencias

En este fragmento de código T-SQL una vez que se evalúa en VERDADERO el predicado de la sentencia IF, la instrucción GOTO calcular_salario omitirá el resto de sentencias (i.e.sentencia 1sentencia 2sentencia 3sentencia n) y dará el salto a la etiqueta calcular_salario para continuar a partir de ahí la ejecución de las sentencias otras_sentencias.

Deberíamos considerar la nota dada en [2]:
"The logic implemented using GOTO can almost always be implemented using the other control-of-flow statements. GOTO is best used for breaking out of deeply nested control-of-flow statements."

4. Práctica: Código C#

Escribamos un ejemplo práctico usando la base de datos Adventure Works 2012, en particular la tabla HumanResources.Department para validar que el nombre de un departamento ya se encuentra en uso. Si el departamento se encuentra en la tabla mencionada, se omitirá la inserción del registro en la base datos y sólo se mostrará un mensaje en la salida estándar anunciando que el registro para ese departamento ya existe.


Declaramos las variables:
  • Línea 3: La variable @NombreDepartamento contiene el nombre de departamento que queremos insertar en la tabla HumanResources.Department.
  • Línea 4: La variable @NombreGrupo contiene el nombre del grupo para el departamento.
  • Línea 5: Con la variable @Existe de tipo bit mantenemos control si el registro para Engineering existe.
Con la sentencia IF de la línea 7 validamos si el registro con Name igual al valor de @NombreDepartamento existe. Ha sido intencional que esta esta expresión se evalúe en verdadero, pues el propósito es demostrar el uso de GOTO (línea 10). Notemos además que hemos asignado 1 a la variable @Existe para indicar que el registro existe.

Ahora nos encontramos en la línea 17 (las líneas 12-16 han sido omitidas por el uso de GOTO) y aquí validamos que el valor de @Existe sea igual a 1. Dado que es así, mostramos el mensaje correspondiente con PRINT.

Cuando ejecutamos este batch en Microsoft SQL Management Studio obtenemos este resultado en la salida de mensajes:

El departmento Engineering ya existe en `HumanResources.Department`.

5. Conclusiones

Hemos aprendido a usar la sentencia GOTO para dar saltos en el flujo de control de un batch de T-SQL. A pesar de su utilidad, hay que tener siempre en cuenta que el excesivo uso de esta construcción puede conllevar a la generación de código difícil de comprender. En su lugar se puede recurrir a otras sentencias de control flujo aptas para lógicas más complejas.


En la próxima receta T-SQL (2-9) veremos cómo podemos pausar la ejecución durante un determinado período.

6. Glosario

  • Base de datos
  • Batch
  • Salto
  • Sentencia

7. Literatura & Enlaces

[1]: SQL Server 2012 T-SQL Recipes - A Problem-Solucion Approach by Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield. Copyright 2012 Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield, 978-1-4302-4200-0.
[2]: Using GOTO - https://technet.microsoft.com/en-us/library/ms188729(v=sql.105).aspx


J

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.