Omitir notificación de errores

31/08/2004 - 02:19 por Max | Informe spam
Hola a todos. Quisiera saber si alguien me puede dar una
mano con el siguiente problema:

tengo un sp que recibe un par de datos como parámetros (un
número Id foráneo y un texto) y los inserta en una tabla.

Deseo que cuando los datos ingresados rompan alguna de las
condiciones de integridad referencial definidas para la
tabla (por ejemplo alguna restricción sobre el valor del
campo Id) el sp no me genere un error, sinó que pueda
deshacer las eventuales transacciones previas y continuar
la ejecución.

Lo primero ya lo hice mediante el uso de transacciones,
sin embargo me resulta imposible volver el sp al estado
de 'no error' y me señala el error a la primera
instrucción SELECT que ejecuto posterior al ROLLBACK.

Si alguien me puede ayudar, le estaría inmensamente
agradecido. De antemano muchas gracias.

Max

Preguntas similare

Leer las respuestas

#1 MAXI
31/08/2004 - 02:40 | Informe spam
Hola, por favor postianos el codigo y lo vemos juntos.

Un abrazo




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar
Msn Messager:

"Max" escribió en el mensaje
news:31ac01c48ef0$37cfb170$
Hola a todos. Quisiera saber si alguien me puede dar una
mano con el siguiente problema:

tengo un sp que recibe un par de datos como parámetros (un
número Id foráneo y un texto) y los inserta en una tabla.

Deseo que cuando los datos ingresados rompan alguna de las
condiciones de integridad referencial definidas para la
tabla (por ejemplo alguna restricción sobre el valor del
campo Id) el sp no me genere un error, sinó que pueda
deshacer las eventuales transacciones previas y continuar
la ejecución.

Lo primero ya lo hice mediante el uso de transacciones,
sin embargo me resulta imposible volver el sp al estado
de 'no error' y me señala el error a la primera
instrucción SELECT que ejecuto posterior al ROLLBACK.

Si alguien me puede ayudar, le estaría inmensamente
agradecido. De antemano muchas gracias.

Max
Respuesta Responder a este mensaje
#2 Javier Loria
31/08/2004 - 03:11 | Informe spam
Hola:
Si el ingreso del dato viola alguna regla de integridad referencial, no
hay forma de evitar el envio del error, es totalmente automatico.
Te quedan 2 alternativas:
a) Evitar el Error: Dificil muy dificil pero posible, requiere codigo y
mantenimiento. Debes escribir el codigo de inserccion con las reglas
referenciales implicitas. Asumiendo que por ejemplo quieras insertar la fila
e hiciste:
=INSERT Tabla(ID, Texto)
VALUES(@ID, Texto)
=Y ID es una columna que tiene una relacion con la tabla2, entonces podrias
escribir algo como:
=INSERT Tabla(ID, Texto)
SELECT Ins.Id, Ins.Texto
(SELECT @ID AS ID
, @Texto AS Texto) AS Ins
JOIN Tabla2
ON Ins.Id=Tabla2.Id
= Este SELECT no puede fallar o por lo menos no puede fallar por llave
Foranea, porque si @ID no existe el JOIN elimina la fila, y si existe esta
ok.
Esto como te digo es dificil y sobretodo redundante, pero si es codigo
de una ocasion me parece valido.
b) Vivir con el error: Olvidarse de los Errores y unicamente fijarse el en
RESULTADO del SP, esto implica que puedes hacer Rollback, y si quieres
incluso RAISERROR pero el cliente solo se fija en el resultado del
procedimiento basado en el valor del RETURN, 0 si es existoso y diferente de
0 si es error.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda
"Max" wrote in message
news:31ac01c48ef0$37cfb170$
Hola a todos. Quisiera saber si alguien me puede dar una
mano con el siguiente problema:

tengo un sp que recibe un par de datos como parámetros (un
número Id foráneo y un texto) y los inserta en una tabla.

Deseo que cuando los datos ingresados rompan alguna de las
condiciones de integridad referencial definidas para la
tabla (por ejemplo alguna restricción sobre el valor del
campo Id) el sp no me genere un error, sinó que pueda
deshacer las eventuales transacciones previas y continuar
la ejecución.

Lo primero ya lo hice mediante el uso de transacciones,
sin embargo me resulta imposible volver el sp al estado
de 'no error' y me señala el error a la primera
instrucción SELECT que ejecuto posterior al ROLLBACK.

Si alguien me puede ayudar, le estaría inmensamente
agradecido. De antemano muchas gracias.

Max
Respuesta Responder a este mensaje
#3 Adrian D. Garcia
31/08/2004 - 19:13 | Informe spam
Una forma de hacer esto es verificar las reglas de integridad referencial en
forma manual antes de hacer el INSERT, por ejemplo si tienes que verificar
que el ID de una fila no este duplicado ya que es la clave primaria el
codigo seria algo asi...


IF EXISTS(SELECT * FROM latabla WHERE ID = @IDNuevo)
BEGIN
ROLLBACK TRAN
...
END
ELSE
BEGIN
INSERT INTO latabla VALUES (@IDNuevo, . )
...
END

Esto tiene la ventaja que dependiendo del nivel de aislamiento que tenga la
transaccion no se generan lockeos excluisvos o de update en forma
innecesaria hasta el momento del INSERT. Tambien puedes de esta forma
levantar tus propios mensajes de error.

Las desventajas que tiene es que debes escribir mas y siempre existe la
posibilidad de que se agreguen reglas nuevas de integridad referencial que
luego no se vean reflejadas en el codigo.

Saludos
Adrian D. Garcia
MCSD
NDSoft Consultoria y Desarrollo

"Max" wrote in message
news:31ac01c48ef0$37cfb170$
Hola a todos. Quisiera saber si alguien me puede dar una
mano con el siguiente problema:

tengo un sp que recibe un par de datos como parámetros (un
número Id foráneo y un texto) y los inserta en una tabla.

Deseo que cuando los datos ingresados rompan alguna de las
condiciones de integridad referencial definidas para la
tabla (por ejemplo alguna restricción sobre el valor del
campo Id) el sp no me genere un error, sinó que pueda
deshacer las eventuales transacciones previas y continuar
la ejecución.

Lo primero ya lo hice mediante el uso de transacciones,
sin embargo me resulta imposible volver el sp al estado
de 'no error' y me señala el error a la primera
instrucción SELECT que ejecuto posterior al ROLLBACK.

Si alguien me puede ayudar, le estaría inmensamente
agradecido. De antemano muchas gracias.

Max
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida