Variables Locales Una variable local de Transact-SQL es un objeto que contiene un dato individual de un tipo especfico. Normalmente las variables se utilizan en lotes y secuencias de comandos: Como contadores, para contar el nmero de veces que se realiza un bucle o controlar cuntas veces debe ejecutarse. Para contener un dato que desea probar mediante una instruccin de control de flujo. Para guardar un dato que se va a devolver en un cdigo de retorno de un procedimiento almacenado.
Declarar una variable. La instruccin DECLARE inicializa una variable de Transact-SQL al: Asignar un nombre. El nombre debe tener un nico @ como primer carcter. Asignar un tipo de datos suministrado por el sistema o definido por el usuario y una longitud. Para las variables numricas, se asignan tambin una precisin y una escala. Establecer el valor a NULL. Sintaxis: DECLARE @nombre_variable tipo_dato [, ] El alcance de una variable es el conjunto de instrucciones de Transact-SQL desde las que se puede hacer referencia a la variable. El alcance de una variable se extiende desde el punto en el que se declara hasta el final del lote o procedimiento almacenado en el que se ha declarado.
Asignar un valor en una variable. Cuando una variable se declara por primera vez, su valor se establece a NULL. Para asignar un valor a una variable, use la instruccin SET. Tambin se puede asignar un valor a una variable si se hace referencia a ella en la lista de seleccin de una instruccin SELECT. Para asignar un valor a una variable mediante la instruccin SET, incluya el nombre de la variable y el valor que desea asignar a la misma. Sintaxis: SET @nombre_variable = expresin Tambin es posible asignar un valor a una variable con la instruccin SELECT.
Ejemplos: En el siguiente ejemplo declaramos la variable @id de tipo entera, en la primera consulta obtenemos el cdigo de la categora Beverages y en la segunda Curso: Administracin de Base de Datos I Sesin 06
Ing. J aime Briones V. jaimebv@gmail.com 2 consulta usamos la variable @id para obtener todos los productos de la categora Beverages. USE Nor t hwi nd DECLARE @I d i nt
SELECT @I d = Cat egor yI D FROM Cat egor i es WHERE Cat egor yName = ' Bever ages'
SELECT Pr oduct I D, Pr oduct Name, Cat egor yI D FROM Pr oduct s WHERE Cat egor yI D = @I d
El siguiente es el conjunto de resultados:
Pr oduct I D Pr oduct Name Cat egor yI D - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 Chai 1 2 Chang 1 24 Guar an Fant st i ca 1 34 Sasquat ch Al e 1 35 St eel eye St out 1 38 Ct e de Bl aye 1 39 Char t r euse ver t e 1 43 I poh Cof f ee 1 67 Laughi ng Lumber j ack Lager 1 70 Out back Lager 1 75 Rhnbr u Kl ost er bi er 1 76 Lakkal i kr i 1
( 12 r ow( s) af f ect ed)
Este ejemplo utiliza una variable local denominada @find para recuperar informacin de todos los autores cuyos apellidos comienzan con Ring. USE pubs DECLARE @f i nd var char ( 30) SET @f i nd = ' Ri ng%' SELECT au_l name, au_f name, phone FROM aut hor s WHERE au_l name LI KE @f i nd
El siguiente es el conjunto de resultados:
au_l name au_f name phone - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Ri nger Anne 801 826- 0752 Ri nger Al ber t 801 826- 0752
( 2 r ow( s) af f ect ed)
Este ejemplo recupera nombres de empleados de los empleados de Binnet & Hardley (pub_id = 0877) contratados el 1 de enero de 1993 o posteriormente. USE pubs DECLARE @pub_i d char ( 4) , @hi r e_dat e dat et i me SET @pub_i d = ' 0877' SET @hi r e_dat e = ' 1/ 01/ 93' SELECT f name, l name FROM empl oyee WHERE pub_i d = @pub_i d and hi r e_dat e >= @hi r e_dat e Curso: Administracin de Base de Datos I Sesin 06
Ing. J aime Briones V. jaimebv@gmail.com 3 El siguiente es el conjunto de resultados:
f name l name - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Anabel a Domi ngues Paul Henr i ot
( 2 r ow( s) af f ect ed)
Variables Globales Las variables globales son predefinidas y mantenidas por SQL Server. Los usuarios no pueden asignar o cambiar directamente el valor de una variable global. Muchas de las variables globales reportan la actividad que el sistema ha tenido desde la ltima vez que se inici; otras reportan informacin sobre la conexin. Las variables globales estn precedidas por dos smbolos @. Las variables globales son tiles para verificar cierta informacin o condicin del entorno actual de SQL Server. Por ejemplo: Ejemplos: Utilizar la variable @@versin para consultar la versin actual de SQL Server. sel ect @@ver si on El siguiente es el conjunto de resultados: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Mi cr osof t SQL Ser ver 2008 ( RTM) - 10. 0. 1600. 22 ( X64) J ul 9 2008 14: 17: 44 Copyr i ght ( c) 1988- 2008 Mi cr osof t Cor por at i on Ent er pr i se Edi t i on ( 64- bi t ) on Wi ndows NT 6. 1 <X64> ( Bui l d 7601: Ser vi ce Pack 1)
( 1 r ow( s) af f ect ed)
El siguiente ejemplo trata de actualizar el precio de un producto que no existe y luego se verifica si la instruccin se ejecut satisfactoriamente comprobando el valor de la variable global @@RowCount. USE Nor t hwi nd UPDATE Pr oduct s SET Uni t Pr i ce = Uni t Pr i ce + 1. 0 WHERE Pr oduct I D = 90 I F ( @@RowCount = 0) BEGI N PRI NT ' Ni nguna Fi l a f ue act ual i zada' RETURN END El siguiente es el conjunto de resultados: ( 0 r ow( s) af f ect ed)
Ni nguna Fi l a f ue act ual i zada Curso: Administracin de Base de Datos I Sesin 06
Ing. J aime Briones V. jaimebv@gmail.com 4 CONTROL DE FLUJO Transact SQL proporciona un conjunto de palabras que forman parte del llamado Lenguaj e de Control de Fluj o, con el cual podemos controlar la secuencia y el nmero de veces que se debe ejecutar una o un grupo de instrucciones. BEGINEND BEGIN y END se usan para agrupar varias instrucciones de Transact-SQL en un bloque lgico. Use BEGIN y END en cualquier parte donde una instruccin de control de flujo deba ejecutar un bloque con dos o ms instrucciones de Transact- SQL. BEGIN y END se usan cuando: Es necesario que un bucle WHILE incluya un bloque de instrucciones. Es necesario que un elemento de una funcin CASE incluya un bloque de instrucciones. Es necesario que una clusula IF o ELSE incluya un bloque de instrucciones. Sintaxis: BEGI N . . . . . . END
IF IF permite verificar una condicin, y si su resultado es verdadero ejecuta una instruccin o un bloque de instrucciones. Sintaxis: Ejecuta una instruccin si la condicin es verdadera. I F Condi ci n I nst r ucci n Ejecuta un bloque de instrucciones si la condicin es verdadera. I F Condi ci n BEGI N I nst r ucci n I nst r ucci n . . . END Donde: Condicin, representa la expresin lgica que debe ser evaluada y su valor es True False. Instruccin, representa la operacin que debe ser ejecutada.
Curso: Administracin de Base de Datos I Sesin 06
Ing. J aime Briones V. jaimebv@gmail.com 5 IF. . . ELSE La clusula ELSE en la instruccin IF permite definir una instruccin o un bloque de instrucciones, que ser ejecutada cuando la condicin da como resultado False. Sintaxis: I F Condi ci n I nst r ucci n ELSE I nst r ucci n
CASE La funcin CASE es una expresin especial de Transact-SQL que permite que se muestre un valor alternativo dependiendo del valor de una columna. Este cambio es temporal, con lo que no hay cambios permanentes en los datos. La funcin CASE acepta dos formatos que describiremos a continuacin. Formato 1 Sintaxis: CASE Expr esi nEnt r ada WHEN Expr esi nCuando THEN Expr esi nResul t ado [ , n] [ ELSE Expr esi nResul t adoEl se] END Donde: - ExpresinEntrada, es la expresin que evala la funcin CASE. - ExpresinCuando, es la expresin con la que es comparada la ExpresinEntrada, sin son iguales retorna la ExpresinResultado correspondiente. - ExpresinResultado, es la expresin que retorna la funcin CASE cuando la ExpresinCuando es igual a ExpresinEntrada. - ExpresinResultadoElse, es la expresin que retorna cuando la ExpresinEntrada no es igual con ninguna ExpresinCuando. Ejemplo: El siguiente ejemplo muestra el primer da de la semana que se ha establecido con SET DATEFIRST: 1 para lunes, 2 para martes y as hasta 7 para el domingo. SELECT CASE @@DATEFI RST WHEN 1 THEN ' Lunes' WHEN 2 THEN ' Mar t es' WHEN 3 THEN ' Mi r col es' WHEN 4 THEN ' J ueves' WHEN 5 THEN ' Vi er nes' WHEN 6 THEN ' Sbado' WHEN 7 THEN ' Domi ngo' ELSE ' NONE' END AS ' 1er d a de l a Semana' Curso: Administracin de Base de Datos I Sesin 06
Ing. J aime Briones V. jaimebv@gmail.com 6 El siguiente es el conjunto de resultados: 1er d a de l a Semana - - - - - - - - - - - - - - - - - - - - Domi ngo
( 1 r ow( s) af f ect ed)
Formato 2 Sintaxis: CASE Expr esi nBool eana THEN Expr esi nResul t ado [ , n] [ ELSE Expr esi nResul t adoEl se] END Donde: - ExpresinBooleana, es la expresin que evala la funcin CASE, si es verdadera retorna la ExpresinResultado correspondiente. - ExpresinResultado, es la expresin que retorna la funcin CASE cuando la ExpresinBooleana es verdadera. - ExpresinResultadoElse, es la expresin que retorna la funcin CASE cuando ninguna ExpresinBoolena es verdadera. Ejemplo: El siguiente ejemplo muestra un comentario acerca de los precios de los productos. USE Nor t hwi nd SELECT Pr oduct Name, Uni t Pr i ce, CASE WHEN Uni t Pr i ce < 0 THEN ' Pr eci o Er r ado' WHEN Uni t Pr i ce < 8 THEN ' Se puede compr ar ' WHEN Uni t Pr i ce < 14 THEN ' Un poco car o' ELSE ' Bi en Car o' END AS ' Pr eci o' FROM Pr oduct s El siguiente es el conjunto de resultados: Pr oduct Name Uni t Pr i ce Pr eci o - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Chai 18. 0000 Bi en Car o Chang 19. 0000 Bi en Car o Ani seed Syr up 10. 0000 Un poco car o Chef Ant on' s Caj un Seasoni ng 22. 0000 Bi en Car o Chef Ant on' s Gumbo Mi x 21. 3500 Bi en Car o Gr andma' s Boysenber r y Spr ead 25. 0000 Bi en Car o Uncl e Bob' s Or gani c Dr i ed Pear s 30. 0000 Bi en Car o Nor t hwoods Cr anber r y Sauce 40. 0000 Bi en Car o Mi shi Kobe Ni ku 97. 0000 Bi en Car o Konbu 6. 0000 Se puede compr ar . . . Or i gi nal Fr ankf ur t er gr ne Soe 13. 0000 Un poco car o ( 77 r ow( s) af f ect ed) Curso: Administracin de Base de Datos I Sesin 06
Ing. J aime Briones V. jaimebv@gmail.com 7 WHILE Establece una condicin para la ejecucin repetida de una instruccin o bloque de instrucciones de SQL. Las instrucciones se ejecutan repetidamente mientras la condicin especificada sea verdadera. Se puede controlar la ejecucin de instrucciones en el bucle WHILE con las palabras clave BREAK y CONTINUE. Sintaxis: WHI LE Expr esi nBool eana {I nst r ucci nSQL | Bl oqueI nst r ucci ones} [ BREAK] {I nst r ucci nSQL | Bl oqueI nst r ucci ones} [ CONTI NUE] END Donde: - ExpresinBooleana, es una expresin que devuelve TRUE (verdadero) o FALSE (falso). Si ExpresinBooleana contiene una instruccin SELECT, esta debe ir entre parntesis. {I nst r ucci nSQL | Bl oqueI nst r ucci ones} Se trata de cualquier instruccin o grupo de instrucciones de Transact-SQL definidos con un bloque de instrucciones. - BREAK, hace que se salga del bloque WHILE ms interno. Se ejecutan las instrucciones que aparecen despus de la palabra clave END, que marca el final del bucle. - CONTINUE, hace que se reinicie el bucle WHILE y se omitan las instrucciones que haya despus de la palabra clave CONTINUE.
Ejemplo: El siguiente ejemplo muestra los nmeros de 1 al 10. DECLARE @Cont i nt SET @Cont = 1 WHI LE ( @Cont <=10) BEGI N Pr i nt @Cont SET @Cont = @Cont + 1 END El siguiente es el conjunto de resultados: 1 2 3 4 5 6 7 8 9 10
Curso: Administracin de Base de Datos I Sesin 06
Ing. J aime Briones V. jaimebv@gmail.com 8 El siguiente ejemplo imprime los nmeros del 1 al 15, pero no incluye el 5. DECLARE @Cont i nt SET @Cont = 0 WHI LE EXI STS( SELECT *) BEGI N SET @Cont = @Cont + 1 I F ( @Cont = 5) CONTI NUE Pr i nt @Cont I F ( @Cont = 15) BREAK END El siguiente es el conjunto de resultados: 1 2 3 4 6 7 8 9 10 11 12 13 14 15
RETURN La instruccin RETURN termina incondicionalmente una consulta, procedimiento almacenado o lote. Ninguna de las instrucciones de un procedimiento almacenado o lote que siga a la instruccin RETURN se ejecutar. Sintaxis: RETURN [ Expr esi nEnt er a] Donde: - ExpresinEntera, es el valor entero que se devuelve. Los procedimientos almacenados pueden devolver un valor entero al procedimiento que realiza la llamada o a una aplicacin. Ejemplo: El siguiente ejemplo por la condicin del bucle debera imprimir los nmeros del 1 al 15, pero el IF interno solo permite imprimir los nmeros del 1 al 4. DECLARE @Cont i nt SET @Cont = 0 WHI LE ( @Cont < 15) BEGI N SET @Cont = @Cont + 1 I F ( @Cont = 5) RETURN Pr i nt @Cont Curso: Administracin de Base de Datos I Sesin 06
Ing. J aime Briones V. jaimebv@gmail.com 9 END El siguiente es el conjunto de resultados: 1 2 3 4