Cuando desarrollamos con T-SQL, necesitamos tomar en consideración situaciones en la cuales nuestro código puede fallar. SQL Server provee herramientas para el manejo de errores. Esta se mejoro con SQL Server 2005 (TRY/CATCH), sin embargo existen todavía algunos aspectos de T-SQL que siguen faltando. SQL Server 2008 no agrego ninguna mejora en esta área.

En este documento vamos a ver cómo podemos hacer el manejo de errores sin el constructor TRY/CATCH.

Recordemos que el manejo de errores en T-SQL sin TRY/CATCH tiene limitaciones.

La principal herramienta que se tiene es la función @@ERROR, esta nos regresa un entero de la última sentencia ejecutada, donde cero indica que no hay error y diferente de cero el error que se genero. Siempre debemos asignar este valor a una variable sino queremos que se pierda el valor. Una vez teniendo el número de error debemos incluir en el código un manejo de errores y pasarle el control con un comando GOTO si queremos realizar alguna acción o simplemente imprimir el error generado.

Existen errores en el código que no van a mostrar el error y simplemente van a terminar el batch, por ejemplo el hacer referencia a un objeto que no exista o algún error al convertir algún tipo de dato.

La forma correcta de asignar estas variables es la siguiente:

DECLARE @err AS INT, @rc AS INT;
--Sentencia SQL
SELECT @err = @@ERROR, @rc = @@ROWCOUNT;
--Manejo de errores en esta sección
SELECT @err AS error_number, @rc AS row_count;

Las variables no deben asignarse de la siguiente manera ya que no se asigna el valor correcto al segundo SET.

SET @err = @@ERROR;
SET @rc = @@ROWCOUNT;

A continuación se muestra un ejemplo de la manera en que debemos crear nuestros procedures y la forma en que debemos ejecutarlos para capturar los errores.

CREATE PROC dbo.prc_ejemplo
@id AS int,
@defecha AS DATETIME = '19000101',
@hoy AS DATETIME = '99991231 23:59:59.997',
@numrows AS INT OUTPUT
AS

DECLARE @err AS INT;

SELECT id, nombre FROM usuarios
WHERE id = @id
AND fechaAlta >= @defecha
AND fechaAlta < @hoy

SELECT @numrows = @@ROWCOUNT, @err = @@ERROR

RETURN @err
GO

Con este código el procedure va regresar en la variable @@ERROR el estatus de la ejecución y en @@ROWCOUNT la salida asignada por la variable @numrows, todo esto en caso de que el procedure no falle por algún error que no sea reportado en un batch como los comentados en la NOTA anterior, para ese caso lo debemos evaluar al ejecutar el procedure, como lo muestro en el siguiente ejemplo.

SET LOCK_TIMEOUT 5000
DECLARE @err AS INT, @rc AS INT

EXEC @err = dbo.prc_ejemplo
@id = 1,
@fromdate = '20100101',
@todate = '20100107',
@numrows = @rc OUTPUT

SELECT – Para errores del tipo batch-aborting
@err = COALESCE(@err, @@ERROR),
@rc = COALESCE(@rc, @@ROWCOUNT)
SELECT @err AS error_number, @rc AS row_count

IF @err = 0 AND @rc > 0 BEGIN
PRINT 'Ejecutado exitosamente'
RETURN
END

IF @err = 0 AND @rc = 0 BEGIN
PRINT 'No se seleccionaron registros.'
RETURN
END

IF @err = 1222
BEGIN
PRINT 'Expiro el tiempo de bloqueo.'
RETURN
END

-- Otros errores
-- IF @err = ...

BEGIN
PRINT 'Error desconocido encontrado.'
RETURN
END

En el código anterior en caso de presentarse un error que aborte el batch, será capturado con la variable @err, de lo contrario traerá el valor asignado por el procedure.

Es muy importante manejar el error de timeout o el tiempo que puede permanecer bloqueada una transacción, para poder tomar acciones dentro de nuestro código, ya sea ejecutar nuevamente la sentencia o informar al usuario del problema presentado mediante una pantalla de errores. De esa manera el usuario puede informar al área de soporte correspondiente del problema que se le presento.

 

 

 

You are not authorised to post comments.

Comments powered by CComment

DBASupport - Foro

Mirroring con estados disconnected
Hola, el día de hoy después de reiniciar mi servidor de destino a donde realizo el mirroring ya no pude replicar más, el error que muestra es que...

Se me duplica el mensaje en /etc/motd
  • Topic started by agamez
  • in General
  • 3 years ago.
  • 3 years ago.
  • 2 replies
Buen día, alguien tiene idea porque después de actualizar a fedora 28 se me esta duplicando la salida de mi /etc/motd?

Cómo puedo filtrar un mensaje en el log messages
Buenos días, estoy recibiendo en mi log de errores muchos mensajes de cron, ya que tengo varios crones configurados en mi server. Existe alguna...

Cómo validar la hora de ejecución de un proceso
Hola, estoy tratando de validar que un proceso sólo pueda ser ejecutado dentro de un periodo de tiempo, en este caso entre las 7:00 AM y las 7:00...

Estadisticas en la base de datos
Buenos días, estoy teniendo problemas de performance en mis queries y quisiera saber como puedo validar que mis tablas tienen las estadisticas...
URGE AYUDA
  • Topic started by
  • in General
  • 15 years ago.
  • 15 years ago.
  • 30 replies
HOLA ESPERO ME PUEDAN AYUDAR. TEN GO UNA TABLA CON una estructura similar a la siguiente: id_mov cargo subtotal total...

Duada de Memoria de SQL Server 2005
  • Topic started by Erzengel
  • in General
  • 11 years ago.
  • 11 years ago.
  • 30 replies
Buen Día Recurro nuevamente a su sabiduría. Quiero saber el porque tiene un tope SQL Serever de 2GB en Windows server 2003 de 32 bit y si alguien...

SqlDateTime overflow
  • Topic started by
  • in General
  • 15 years ago.
  • 15 years ago.
  • 11 replies
Alguno de ustedes ha tenido este problema: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.' Les...

problemas para iniciar el agente sql
  • Topic started by acgch
  • in General
  • 14 years ago.
  • 14 years ago.
  • 11 replies
Recientemente para asegurar el sql server 2005, cree una cuenta sql con derechos de sysadmin y borre el grupo BUILTIN\Administradores para evitar...

Problemas para levantar mirror
  • Topic started by acgch
  • in General
  • 14 years ago.
  • 14 years ago.
  • 16 replies
Hola amigos, tengan un buen día, les comento que estoy configurando mirror siguiendo los pasos a través del wizard del managment studio y también...
Mirroring con estados disconnected
Hola, el día de hoy después de reiniciar mi servidor de destino a donde realizo el mirroring ya no pude replicar más, el error que muestra es que...

Se me duplica el mensaje en /etc/motd
  • Topic started by agamez
  • in General
  • 3 years ago.
  • 3 years ago.
  • 2 replies
Buen día, alguien tiene idea porque después de actualizar a fedora 28 se me esta duplicando la salida de mi /etc/motd?

Cómo puedo filtrar un mensaje en el log messages
Buenos días, estoy recibiendo en mi log de errores muchos mensajes de cron, ya que tengo varios crones configurados en mi server. Existe alguna...

Cómo validar la hora de ejecución de un proceso
Hola, estoy tratando de validar que un proceso sólo pueda ser ejecutado dentro de un periodo de tiempo, en este caso entre las 7:00 AM y las 7:00...

Estadisticas en la base de datos
Buenos días, estoy teniendo problemas de performance en mis queries y quisiera saber como puedo validar que mis tablas tienen las estadisticas...
Deshabilitar todos los jobs
  • Topic started by agamez
  • in Jobs
  • 4 years ago.
  • 4 years ago.
  • 1 reply
Buenos días, alguien sabe como puedo deshabilitar rapidamente todos los jobs de SQL Server, gracias.

Mirroring con estados disconnected
Hola, el día de hoy después de reiniciar mi servidor de destino a donde realizo el mirroring ya no pude replicar más, el error que muestra es que...

Se me duplica el mensaje en /etc/motd
  • Topic started by agamez
  • in General
  • 3 years ago.
  • 3 years ago.
  • 2 replies
Buen día, alguien tiene idea porque después de actualizar a fedora 28 se me esta duplicando la salida de mi /etc/motd?

Cómo puedo filtrar un mensaje en el log messages
Buenos días, estoy recibiendo en mi log de errores muchos mensajes de cron, ya que tengo varios crones configurados en mi server. Existe alguna...

Cómo validar la hora de ejecución de un proceso
Hola, estoy tratando de validar que un proceso sólo pueda ser ejecutado dentro de un periodo de tiempo, en este caso entre las 7:00 AM y las 7:00...