UNIVERSIDAD AUTONOMA GABRIEL RENE MORENO
FACULTAD DE CIENCIAS DE LA COMPUTACION
Carrera de Ingeniería Informática
Introducción a la Programación
con Transact SQL (T SQL)
Docente: Ing. Ubaldo Pérez Ferreira
Santa Cruz de la Sierra – Bolivia
Introducción al lenguaje Transact SQL
SQL es un lenguaje de consulta para los Sistemas de
Bases de Datos Relaciónales, pero que no posee la
potencia de los lenguajes de programación.
Transact SQL (T SQL), es el lenguaje de programación
que proporciona al SQL los elementos característicos de
los lenguajes de programación: variables, sentencias de
control de flujo, bucles ...
Introducción al lenguaje Transact SQL
Cuando se desea realizar una aplicación completa para el
manejo de una Base de Datos Relacional, resulta
necesario utilizar alguna herramienta que soporte la
capacidad de consulta del SQL y la versatilidad de los
lenguajes de programación tradicionales.
Transact SQL es el lenguaje de programación que
permite extender el SQL estándar con otro tipo de
instrucciones.
Programación con el leguaje Transact SQL
Con Transact SQL se pueden programar las unidades
de programa dentro del SGBD, como ser:
• Scripts
• Funciones
• Procedimientos almacenados
• Triggers
Tipos de datos en Transact SQL
Transact SQL proporciona una variedad predefinida de
tipos de datos . Casi todos los tipos de datos manejados
por Transact SQL son similares a los soportados
por SQL.
Tipos de datos numéricos.
Bit. Una columna o variable de tipo bit puede almacenar el rango de valores de 1 a 0.
SmallInt. Una columna o variable de tipo smallint puede almacenar el rango de valores -32768 a 32767.
Int. Una columna o variable de tipo int puede almacenar el rango de valores -231 a 231-1 .
Decimal(p,s). Una columna de tipo decimal puede almacenar datos númericos decimales sin redondear. Donde p es la precision
(número total del dígitos) y s la escala (número de valores decimales)
Float. Una columna de datos float puede almacenar el rango de valores -1,79x-10308 a 1,79x-10308, , si la definimos con el valor máxmo de
precisión. La precisión puede variar entre 1 y 53.
Real. Sinónimo de float(24). Puede almacenar el rango de valores -3,4x-1038 a 3,4x-1038,
Tipos de datos de caracter.
Char(n). Almacena n caracteres en formato ASCII, un byte por cada letra. Cuando almacenamos datos en el tipo char, siempre se
utilizan los n caracteres indicados, incluso si la entrada de datos es inferior. Por ejemplo, si en un char(5), guardamos el valor 'A', se
almacena 'A ', ocupando los cinco bytes.
Varchar(n).Almacena n caracteres en formato ASCII, un byte por cada letra. Cuando almacenamos datos en el tipo varchar, unicamente
se utilizan los caracteres necesarios,Por ejemplo, si en un varchar(255), guardamos el valor 'A', se almacena 'A', ocupando solo
un byte bytes.
Tipos de datos de fecha.
Datetime. Almacena fechas con una precision de milisegundo. Debe usarse para fechas muy especificas.
SmallDatetime. Almacena fechas con una precision de minuto, por lo que ocupa la mitad de espacio de que el tipo datetime, para
tablas que puedan llegar a tener muchos datos es un factor a tener muy en cuenta.
Tipos de datos binarios.
Binary. Se utiliza para almacenar datos binarios de longitud fija, con una longitud máxima de 8000 bytes.
Varbinary. Se utiliza para almacenar datos binarios de longitud variable, con una longitud máxima de 8000 bytes..Es muy similar a
binary, salvo que varbinary utiliza menos espacio en disco.
Tipo de datos XML.
XML.Una de las grandes mejoras que incorpora SQL Server 2005 es el soporte nativo para XML. Como podemos deducir, este tipo de
datos se utiliza para almacenar XML.
Obtendremos la siguiente salida: <row nombre="SVR01"/>
Declaración de Variables en Transact SQL
En Transact SQL los identificadores de variables deben
comenzar por el carácter @, es decir, el nombre de una
variable debe comenzar por @. Para declarar variables
en Transact SQL debemos utilizar la palabra
clave declare, seguido del identificador y tipo de datos
de la variable.
-- Esto es un comentario de línea simple
/* Este es un comentario con varias líneas*/
DECLARE @nombre CHAR(40) /* declare declara una variable
@nombre es el identificador de la
variable de tipo varchar */
SET @nombre = ‘Hola Mundo‘ /* El signo = es un operador
Hola Mundo es un texto */
PRINT @Nombre -- Imprime por pantalla el valor de @nombre.
-- No hay diferencia mayúsculas ni minúsculas
Asignación de Variables en Transact SQL
En Transact SQL podemos asignar valores a una
variable de varias formas:
• A través de la instrucción SET.
DECLARE @nombre VARCHAR(100)
-- La consulta debe devolver un único registro
SET @nombre = (SELECT nomb FROM prov
WHERE cprv = 1)
PRINT @nombre
Asignación de Variables en Transact SQL
• Utilizando una sentencia SELECT.
DECLARE @codigo INT,
@nombre CHAR(40),
@ciudad CHAR(2)
SELECT @código = calm , @nombre=noma, @ciudad = ciud
FROM alma WHERE calm = 1
PRINT @codigo
PRINT @nombre
PRINT @ciudad
Un punto a tener en cuenta cuando asignamos variables de este
modo, es que si la consulta SELECT devuelve más de un registro,
las variables quedarán asignadas con los valores de la última fila
devuelta.
Asignación de Variables en Transact SQL
• Realizando un FETCH de un CURSOR.
DECLARE @nombre CHAR(40),
@color VARCHAR(15)
DECLARE c_cursor CURSOR FOR SELECT nomp, colo FROM prod
OPEN c_cursor
FETCH c_cursor INTO @nombre, @color
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @nombre + @color
FETCH c_cursor INTO @nombre, @color
END
CLOSE c_cursor
DEALLOCATE c_cursor
Operadores en Transact SQL
La siguiente tabla ilustra los operadores de Transact SQL .
Estructura de Control en Transact SQL
Estructura condicional IF
La estructura condicional IF permite evaluar una
expresión booleana (resultado VERDADERO - FALSO), y
ejecutar las operaciones contenidas en el bloque formado
por BEGIN END. La Sintaxis es:
IF (<expresion>)
BEGIN
...
END
ELSE IF (<expresion>)
BEGIN
...
END
ELSE
BEGIN
...
END
Estructura de Control en Transact SQL
Estructura condicional IF
Ejemplo. Verificar si el Proveedor con código 1 ha
suministrado algún producto
IF (select count(*) from sumi where cprv=1)>1
PRINT 'El proveedor ha suminitrado productos'
ELSE
PRINT 'El proveedor NO ha suminitrado productos'
Estructura de Control en Transact SQL
Estructura condicional CASE
La estructura condicional CASE permite evaluar una
expresión y devolver un valor u otro. La sintaxis general
de case es:
CASE <expresion>
WHEN <valor_expresion> THEN <valor_devuelto>
WHEN <valor_expresion> THEN <valor_devuelto>
ELSE <valor_devuelto> -- Valor por defecto
END
Estructura de Control en Transact SQL
Estructura condicional CASE
Ejemplo. Programa para clasificar a un proveedor en base
al importe de todos sus productos suministrado.
DECLARE @clase char(40),@impt float
SELECT @impt=isnull(sum(impt),0) FROM sumi WHERE cprv=3
SET @clase = (CASE
WHEN (@impt>0 AND @impt<=50) THEN 'Proveedor Minorista'
WHEN (@impt>51 AND @impt<=200) THEN 'Proveedor Intermedio'
WHEN (@impt>200) THEN 'Proveedor Mayorista'
ELSE ‘Proveedor sin Clasificar'
END)
PRINT @clase + ' Importe ' +Cast(@impt as char(10))
Estructura de Control en Transact SQL
Bucle WHile
El bucle WHILE se repite mientras expresion se evalue
como verdadero. Es el único tipo de bucle del que
dispone Transact SQL.
WHILE <expresion>
BEGIN
...
END
Estructura de Control en Transact SQL
Bucle While
Ejemplo. Listar los producto suministrados por el
proveedor 3, en la lista se debe mostrar: el nombre del
producto, color, cantidad y fecha de suministro.
DECLARE @nombre CHAR(40), @color VARCHAR(15), @cant FLOAT, @ftra DATE
DECLARE CDATOS CURSOR
FOR SELECT nomp, colo, cant, ftra FROM sumi, prod WHERE sumi.cprd=prod.cprd
OPEN CDATOS
FETCH CDATOS INTO @nombre, @color, @cant, @ftra
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @nombre + @color + cast(@cant as char(5))+ cast(@ftra as char(12))
FETCH CDATOS INTO @nombre, @color, @cant, @ftra
END
CLOSE CDATOS
DEALLOCATE CDATOS
Control de errores en Transact SQL
Uso de TRY CATCH
A través de las instrucciónes TRY y CATCH se
proporciona el control de errores. La sintaxis es la
siguiente:
BEGIN TRY
...
END TRY
BEGIN CATCH
...
END CATCH
Control de errores en Transact SQL
Uso de TRY CATCH
Ejemplo. Programa que detecta que hay división por
cero.
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
Control de errores en Transact SQL
La variable de sistema @@ERROR
La variable global de sistema @@ERROR almacena el
número de error producido por la última
sentencia Transact SQL ejecutada. Ejemplo:
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
IF @@ERROR=0
PRINT 'No hay error'
ELSE
PRINT 'Se ha producido un error'
Cursores en Transact SQL
Un cursor es una variable que nos permite recorrer
con un conjunto de resultados obtenido a través de
una sentencia SELECT fila a fila.
Cuando se trabaja con cursores se deben seguir los
siguientes pasos.
• Declarar el cursor, utilizando DECLARE
• Abrir el cursor, utilizando OPEN
• Leer los datos del cursor,
utilizando FETCH ... INTO
• Cerrar el cursor, utilizando CLOSE
• Liberar el cursor, utilizando DEALLOCATE
Cursores en Transact SQL
La sintaxis general para trabajar con un cursor es
la siguiente.
-- Declaración del cursor
DECLARE <nombre_cursor> CURSOR
FOR <sentencia_sql>
-- apertura del cursor
OPEN <nombre_cursor>
-- Lectura de la primera fila del cursor
FETCH <nombre_cursor> INTO <lista_variables>
WHILE (@@FETCH_STATUS = 0)
BEGIN
-- Lectura de la siguiente fila de un cursor
FETCH <nombre_cursor> INTO <lista_variables>
...
END -- Fin del bucle WHILE
-- Cierra el cursor
CLOSE <nombre_cursor>
-- Libera los recursos del cursor
DEALLOCATE <nombre_cursor>
Cursores en Transact SQL
Ejemplo. Uso de cursor para leer y mostrar el nombre
y color de todas las filas de la tabla productos.
DECLARE @nombre CHAR(40),
@color VARCHAR(15)
DECLARE c_cursor CURSOR
FOR SELECT nomp, colo FROM prod
OPEN c_cursor
FETCH c_cursor INTO @nombre, @color
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @nombre + @color
FETCH CDATOS INTO @nombre, @color
END
CLOSE c_cursor
DEALLOCATE c_cursor