T SQL - 2021

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 38

Base de Datos II

TRANSACT SQL

Lic. Rosa Irene López Loza


introducción

 Transact SQL es el lenguaje de programación que proporciona


SQL Server para ampliar SQL con los elementos característicos de
los lenguajes de programación: variables, sentencias de control
de flujo, bucles ...
 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
proporciona SQL Server para extender el SQL estándar con otro
tipo de instrucciones.
Declaración de variables
Ejemplo 1

--Declaración de la variable @nombre de tipo varchar de tamaño 20

declare @nombre varchar(20)


--Asignación del valor a la variable nombre

set @nombre = 'Hola Mundo'


--Mostrar por pantalla el valor de la variable nombre

print @Nombre
/* Esto es un comentario con varias líneas.
Transact SQL no distingue entre mayúsculas y minúsculas. Es decir, es lo mismo
NOMBRE, nombre o Nombre */
Ejemplo 2: Asignación utilizando SET

DECLARE @direccion VARCHAR(20)


-- La consulta debe devolver un solo registro
SET @direccion = (SELECT dirEmpleado
FROM Empleados
WHERE nomEmpleado ='Pedro'
and apeEmpleado = 'Duran')
PRINT @direccion
Ejemplo 3: Asignación utilizando SELECT
-- Declaración de variables
DECLARE @nombreProv VARCHAR(20),
@nombreContacto VARCHAR(20),
@cargoContacto VARCHAR(20)
-- Asignación de campos a las variables
SELECT @nombreProv = nomProveedor,
@nombreContacto =nomContacto,
@cargoContacto =cargoContacto
FROM Proveedores
WHERE IdProveedor = 44
-- Impresión por pantalla las variables
PRINT 'PROVEEDOR : '+@nombreProv
PRINT 'NOMBRE : '+ @nombreContacto
PRINT 'CARGO : '+@cargoContacto
Operadores
Operadores
Operadores
ESTRUCTURAS DE CONTROL

 Estructura IF

 Estructura CASE

 Bucle WHILE

 Estructura GOTO
Estructura condicional IF - Sintaxis

IF(<expresión>)
BEGIN

La estructura condicional IF ...


END
permite evaluar una ELSE
expresión booleana IF(<expresión>)
(resultado SI - NO) BEGIN
...
END
ELSE
BEGIN
...
END
Ejemplo 4: Estructura condicional IF

DECLARE @saludo varchar(3)

SET @saludo = 'Hola'

IF @saludo = 'Hola'
BEGIN
PRINT 'Hola Mundo'
END
ELSE
BEGIN
PRINT 'Adiós Mundo'
END
Ejemplo 5: Cambiar la cantidad del precio de un
producto (Subconsultas)

DECLARE @can1 int,


@can2 int
set @can1 = 10
set @can2 = 13

IF EXISTS(SELECT * FROM Productos WHERE PrecioUnidad <@can1)

BEGIN
UPDATE Productos SET PrecioUnidad = @can2
WHERE PrecioUnidad < @can1
END
ELSE
BEGIN
print 'No se encontraron registros'
END
Estructura condicional CASE - Sintaxis 1

La estructura condicional CASE permite evaluar una expresión y


devolver un valor correspondiente. Existe dos formas de escribirlo.
1) CASE <expresion>
WHEN <valor_expresion> THEN <valor_devuelto>
WHEN <valor_expresion> THEN <valor_devuelto>
ELSE <valor_devuelto> -- Valor por defecto
END
2) CASE
WHEN <expresion> = <valor_expresion> THEN <valor_devuelto>
WHEN <expresion> = <valor_expresion> THEN <valor_devuelto>
ELSE <valor_devuelto> -- Valor por defecto

END
Ejemplo 6: Estructura condicional CASE

DECLARE @tipo varchar(20),


@proveedor int

SET @proveedor = 33

SET @tipo = (CASE @proveedor


WHEN 44 THEN 'Mayor Prioridad'

WHEN 77 THEN 'Prioridad media'

ELSE 'Baja prioridad'

END)
PRINT @tipo
Ejemplo 7: Estructura condicional CASE

DECLARE @tipo varchar(20),


@proveedor int

SET @proveedor = 77

SET @tipo = (CASE


WHEN @proveedor = 44 THEN 'Mayor Prioridad'

WHEN @proveedor = 77 THEN 'Prioridad media'

ELSE 'Baja prioridad'

END)
PRINT @tipo
Ejemplo 8 (subconsulta): Obtener el nombre del empleado que
atendió el pedido cuyo código es 12.

DECLARE @EMpleado varchar(100),


@id varchar(5)
SET @id = 12
SET @Empleado = (CASE
WHEN @id < 20 THEN ( SELECT NomEmpleado
FROM RRHH.Empleados E inner join Venta.PedidosCabe PC
ON E.idEmpleado = PC.IdEmpleado
WHERE PC.IdPedido=@id )
WHEN @id < 40 THEN ( SELECT ApeEmpleado
FROM RRHH.Empleados E inner join Venta.PedidosCabe PC
ON E.idEmpleado = PC.IdEmpleado
WHERE PC.IdPedido=@id)
ELSE 'Fuera de rango'
END)
PRINT @Empleado
Bucle WHILE - Sintaxis

El bucle WHILE se repite mientras la expresión se evalúe como


verdadera.

WHILE <expresion>
BEGIN
...
END
Ejemplo 9: Bucle WHILE

-- ¿Cuál es la serie que genera el siguiente código?


DECLARE @contador int
SET @contador = 0
WHILE (@contador < 100)
BEGIN
SET @contador = @contador + 1
PRINT 'Iteracion del bucle ' + cast(@contador AS varchar)
END
Ejemplo 10: CONTINUE (Siguiente) – WHILE

-- ¿Cuál es la serie que genera el siguiente código?

DECLARE @contador int


SET @contador = 0
WHILE (@contador < 100)
BEGIN
SET @contador = @contador + 1
IF (@contador % 2 = 0)
CONTINUE
PRINT 'Iteracion del bucle ' + cast(@contador AS varchar)
END
Ejemplo 11 – BREAK (Sale) - WHILE

-- ¿Qué serie genera el siguiente código?

DECLARE @contador int


SET @contador = 0
WHILE (1 = 1)
BEGIN
SET @contador = @contador + 1
IF (@contador % 50 = 0)
BREAK
PRINT 'Iteracion del bucle ' + cast(@contador AS varchar)
END
Ejemplo 12. Modificar los registros cuyo envío
de pedido es ‘N’, de PedidosCabe, por ‘S’

DECLARE @id int


WHILE EXISTS(SELECT * FROM venta.PedidosCabe WHERE
EnvioPEdido = 'N')
BEGIN
SET @id =(SELECT TOP 1 idPedido
FROM venta.PedidosCabe WHERE envioPedido = 'N')
UPDATE venta.PedidosCabe
SET EnvioPedido = 'S'
WHERE IdPedido = @id
END
Estructura GOTO
Ejemplo 13:¿Qué es lo que valida este código?
DECLARE @divisor int,
@dividendo int,
@resultado int
La sentencia GOTO SET @dividendo = 100
permite desviar el flujo de SET @divisor = 0
ejecución hacia una SET @resultado = @dividendo/@divisor
etiqueta. IF @@ERROR > 0
Fue muy utilizada con la GOTO error
variable de sistema
@@ERROR para el control PRINT 'No hay error'
de errores.
RETURN
error:
PRINT 'Se ha producido una
división por cero'
CONTROL DE ERRORES

 Uso de TRY CATCH

 Funciones especiales de Error

 La variable de sistema @@ERROR

 Generar un error con RAISERROR


TRY CATCH

A partir de la versión 2005, SQL Server proporciona el control de errores


a través de las instrucciones TRY y CATCH.

La sintaxis de TRY CATCH es la siguiente:

BEGIN TRY
...
END TRY
BEGIN CATCH
...
END CATCH
Ejemplo 14: TRY - CATCH

BEGIN TRY
DECLARE @divisor int ,
@dividendo int,
@resultado int
SET @dividendo = 100
SET @divisor = 0
SET @resultado = @dividendo/@divisor
PRINT 'No hay error'
END TRY
BEGIN CATCH
PRINT 'Se ha producido un error'
END CATCH
Funciones especiales de Error
Las funciones especiales de error, están disponibles únicamente en el
bloque CATCH para la obtención de información detallada del error.

 ERROR_NUMBER(), devuelve el número de error.


 ERROR_SEVERITY(), devuelve la severidad del error.
 ERROR_STATE(), devuelve el estado del error.
 ERROR_PROCEDURE(), devuelve el nombre del procedimiento
almacenado que ha provocado el error.
 ERROR_LINE(), devuelve el número de línea en el que se ha
producido el error.
 ERROR_MESSAGE(), devuelve el mensaje de error.
BEGIN TRY
Ejemplo 15 DECLARE @divisor int ,
@dividendo int,
@resultado int
SET @dividendo = 100
SET @divisor = 0
SET @resultado = @dividendo/@divisor
PRINT 'No hay error'
END TRY
BEGIN CATCH
PRINT ERROR_NUMBER()
PRINT ERROR_SEVERITY()
PRINT ERROR_STATE()
PRINT ERROR_PROCEDURE()
PRINT ERROR_LINE()
PRINT ERROR_MESSAGE()
END CATCH
La variable de sistema @@ERROR

 En versiones anteriores a SQL Server 2005, no estaban


disponibles las instrucciones TRY CATCH. En estas
versiones se controlaban los errores utilizando la variable
global de sistema @@ERROR, que almacena el número
de error producido por la última sentencia Transact SQL
ejecutada.
Ejemplo 16

DECLARE @divisor int ,


@dividendo int ,
@resultado int
SET @dividendo = 100
SET @divisor = 0
SET @resultado = @dividendo/@divisor
IF @@ERROR = 0
BEGIN
PRINT 'No hay error'
END
ELSE
BEGIN
PRINT 'Hay error'
END
La variable de sistema @@ERROR

 El uso de @@ERROR para controlar errores puede


provocar multitud de problemas. Uno de los más
habituales es sin duda, incluir una nueva sentencia
Transact SQL entre la línea que provoco el error y la que
lo controla. Esa nueva instrucción restaura el valor de
@@ERROR y no controlaremos el error.
Ejemplo 17 DECLARE @divisor int ,
@dividendo int ,
@resultado int
SET @dividendo = 100
SET @divisor = 0
SET @resultado = @dividendo/@divisor
PRINT 'Controlando el error ...'
IF @@ERROR = 0
BEGIN
PRINT 'No hay error'
END
ELSE
BEGIN
PRINT 'Hay error'
END
Generar un error con RAISERROR

 En ocasiones es necesario provocar


voluntariamente un error, por ejemplo nos puede
interesar que se genere un error cuando los datos
incumplen una regla de negocio.
 Podemos provocar un error en tiempo de
ejecución a través de la función RAISERROR
Generar un error con RAISERROR
Ejemplo 18

DECLARE @tipo int,


@clase int

SET @tipo = 1
SET @clase = 3
IF (@tipo = 1 AND @clase = 3)
BEGIN
RAISERROR (‘Este error lo creamos nosotros',
16, -- Severidad
1 -- Estado
)
END

También podría gustarte