Anda di halaman 1dari 9

Control de errores en Transact SQL Uso de TRY CATCH A partIr de la versin 2005, SQL Server proporciona el control de errores

a travs de las instruccines TRYy CATCH. Estas nuevas instrucciones suponen un gran paso adelante en el control de errores en SQL Server, un tanto precario en las versiones anteriores. La sintaxis de TRY CATCH es la siguiente:

BEGIN TRY ... END TRY BEGIN CATCH ... END CATCH

El siguiente ejemplo ilustra el uso de TRY - CATCH.

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

Funciones especiales de Error Las funciones especiales de error,estn disponibles nicamente en el bloque CATCH para la obtencin de informacin detallada del error. Son:

ERROR_NUMBER(), devuelve el nmero 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 nmero de lnea en el que se ha producido el error. ERROR_MESSAGE(), devuelve el mensaje de error. Son extremadamente tiles para realizar una auditora de errores.

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 ERROR_NUMBER() PRINT ERROR_SEVERITY() PRINT ERROR_STATE() PRINT ERROR_PROCEDURE() PRINT ERROR_LINE() PRINT ERROR_MESSAGE() END CATCH

Lgicamente, podemos utilizar estas funciones para almacenar esta informacin en una tabla de la base de datos y registrar todos los errores que se produzcan. 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 nmero de error producido por la ltima sentencia Transact SQL ejecutada.

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 BEGIN PRINT 'No hay error' END ELSE BEGIN PRINT 'Hay error' END

El uso de @@ERROR para controlar errores puede provocar multitud de problemas. Uno de los ms habituales es sin duda, incluir una nueva sentencia Transact SQL entre la lnea que provoco el error y la que lo controla. Esa nueva instruccin restaura el valor de @@ERROR y no controlaremos el error. El siguiente ejemplo ilustra esta situacin:

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 'Controlando el error ...' -- Esta linea estable @@ERROR a cero IF @@ERROR = 0 BEGIN -- Se ejecuta esta parte! 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 interesas que se genere un error cuando los datos incumplen una regla de negocio. Podemos provocar un error en tiempo de ejecucin a travs de la funcin RAISERROR.

DECLARE @tipo int, @clasificacion int SET @tipo = 1

SET @clasificacion = 3 IF (@tipo = 1 AND @clasificacion = 3) BEGIN RAISERROR ('El tipo no puede valer uno y la clasificacion 3', 16, -- Severidad 1 -- Estado ) END

La funcin RAISERROR recibe tres parmetros, el mensaje del error (o cdigo de error predefinido), la severidad y el estado. La severidad indica el grado de criticidad del error. Admite valores de 0 al 25, pero solo podemos asignar valores del 0 al 18. Los errores el 20 al 25 son considerados fatales por el sistema, y cerraran la conexion que ejecuta el comando RAISERROR. Para asignar valores del 19 al 25 necesitares ser miembros de la funcin de SQL Server sysadmin. El estado es un valor para permitir que el programador identifique el mismo error desde diferentes partes del cdigo. Admite valores entre 1 y 127, permite tratar .

Estructuras de control en Transact SQL Estructura condicional IF La estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO), y ejecutar las operaciones contenidas en el bloque formado por BEGIN END.

IF (<expresion>) BEGIN ... END ELSE IF (<expresion>) BEGIN ... END ELSE BEGIN ... END

Ejemplo de la estructura condicional IF.

DECLARE @Web varchar(100), @diminutivo varchar(3) SET @diminutivo = 'DJK'

IF @diminutivo = 'DJK' BEGIN PRINT 'www.devjoker.com' END ELSE BEGIN PRINT 'Otra Web (peor!)' END

La estructura IF admite el uso de subconsultas:

DECLARE @coPais int, @descripcion varchar(255) set @coPais = 5 set @descripcion = 'Espaa' IF EXISTS(SELECT * FROM PAISES WHERE CO_PAIS = @coPais) BEGIN UPDATE PAISES SET DESCRIPCION = @descripcion WHERE CO_PAIS = @coPais END ELSE BEGIN INSERT INTO PAISES (CO_PAIS, DESCRIPCION) VALUES (@coPais, @descripcion) END

Estructura condicional CASE La estructura condicional CASE permite evaluar una expresion 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

Ejemplo de CASE.

DECLARE @Web varchar(100),

@diminutivo varchar(3) SET @diminutivo = 'DJK' SET @Web = (CASE @diminutivo WHEN 'DJK' THEN 'www.devjoker.com' WHEN 'ALM' THEN 'www.aleamedia.com' ELSE 'www.devjoker.com' END) PRINT @Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones:

CASE WHEN <expresion> = <valor_expresion> THEN <valor_devuelto> WHEN <expresion> = <valor_expresion> THEN <valor_devuelto> ELSE <valor_devuelto> -- Valor por defecto END

El mismo ejemplo aplicando esta sintaxis:

DECLARE @Web varchar(100), @diminutivo varchar(3) SET @diminutivo = 'DJK' SET @Web = (CASE WHEN @diminutivo = 'DJK' THEN 'www.devjoker.com' WHEN @diminutivo = 'ALM' THEN 'www.aleamedia.com' ELSE 'www.devjoker.com' END) PRINT @Web

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas.

DECLARE @Web varchar(100), @diminutivo varchar(3) SET @diminutivo = 'DJK' SET @Web = (CASE WHEN @diminutivo = 'DJK' THEN (SELECT web

FROM WEBS WHERE id=1)


WHEN @diminutivo = 'ALM' THEN (SELECT web

FROM WEBS WHERE id=2)


ELSE 'www.devjoker.com' END) PRINT @Web

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

Un ejemplo del bucle WHILE.

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

Podemos pasar a la siguiente iteracin del bucle utilizando CONTINUE.

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

El bucle se dejar de repetir con la instruccin BREAK.

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

Tambin podemos utilizar el bucle WHILE conuntamente con subconsultas.

DECLARE @coRecibo int WHILE EXISTS (SELECT * FROM RECIBOS WHERE PENDIENTE = 'S')-- Ojo, la subconsulta se ejecuta -- una vez por cada iteracion -- del bucle! BEGIN SET @coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = 'S') UPDATE RECIBOS SET PENDIENTE = 'N' WHERE CO_RECIBO = @coRecibo END

ROLLBACK TRANSACTION (Transact-SQL)

Personas que lo han encontrado til: 0 de 1 - Valorar este tema Revierte una transaccin explcita o implcita hasta el inicio de la transaccin o hasta un punto de retorno dentro de la transaccin. Puede usar ROLLBACK TRANSACTION para borrar todas las modificaciones de datos realizadas desde el inicio de la transaccin o hasta un punto de retorno. Tambin libera los recursos que mantiene la transaccin. Convenciones de sintaxis de Transact-SQL Sintaxis

ROLLBACK { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ] [;] Argumentos

transaction_name
Es el nombre asignado a la transaccin en BEGIN TRANSACTION. transaction_name debe ajustarse a las reglas para los identificadores, pero solo se usan los 32 primeros caracteres del nombre de la transaccin. Cuando se anidan transacciones,transaction_name debe ser el nombre de la instruccin BEGIN TRANSACTION ms externa. @ tran_name_variable

Es el nombre de una variable definida por el usuario que contiene un nombre de transaccin vlido. La variable se debe declarar con un tipo de datos char, varchar, nchar onvarchar.

savepoint_name
Es savepoint_name de una instruccin SAVE TRANSACTION. savepoint_name debe ajustarse a las reglas para los identificadores. Utilice savepoint_name cuando una operacin de reversin condicional solo deba afectar a parte de la transaccin. @ savepoint_variable Es el nombre de una variable definida por el usuario que contiene un nombre de punto de retorno vlido. La variable debe declararse con un tipo de datos char, varchar, nchar onvarchar. Tratamiento de errores

Una instruccin ROLLBACK TRANSACTION no produce ningn mensaje para el usuario. Si necesita indicar advertencias en procedimientos almacenados o en desencadenadores, utilice las instrucciones RAISERROR o PRINT. RAISERROR es la instruccin ms adecuada para indicar errores.

En el ejemplo siguiente se muestra el efecto de revertir una transaccin con nombre. USE tempdb; GO CREATE TABLE ValueTable ([value] int;) GO DECLARE @TransactionName varchar(20) = 'Transaction1'; --The following statements start a named transaction, --insert two rows, and then roll back --the transaction named in the variable @TransactionName. --Another statement outside of the named transaction inserts two rows. --The query returns the results of the previous statements. BEGIN TRAN @TransactionName INSERT INTO ValueTable VALUES(1), (2); ROLLBACK TRAN @TransactionName; INSERT INTO ValueTable VALUES(3),(4); SELECT [value] FROM ValueTable; DROP TABLE ValueTable; --Results --value ---------------

--4

Anda mungkin juga menyukai