Capturar mensaje de error desde una SP

09/12/2003 - 17:15 por rev20_ftp | Informe spam
Hola, estoy creando una SP que borra registros de una tabla siempre
que no estén referenciados desde otra, la cuestión es que necesito
capturar el mensaje que me da cuando intento borrar uno de estos
registros para informar en una tabla de log cual es la tabla que
contiene la referencia.
Me explico, si al intentar borrar un registro obtengo el mensaje:

Servidor: mensaje 547, nivel 16, estado 1, línea 11
DELETE statement conflicted with COLUMN REFERENCE constraint
'FK_COMPANIA_DIVISA'. The conflict occurred in database 'XSIX', table
'MST_COMPANIA', column 'COD_DIVISA'.
The statement has been terminated.

quisiera poder insertar en la tabla log_mensajes algo como:

"La divisa xx no se ha borrado porque se utiliza en la tabla
MST_COMPANIA"

pues bien, soy incapaz de obtener el nombre de la tabla o asignar el
string del mensaje (una vez rellenado por sqlserver, no el texto de
sysmessages) a una variable.

Gracias por vuestra ayuda de antemano.

Un saludo
 

Leer las respuestas

#1 Javier Loria
09/12/2003 - 18:40 | Informe spam
Hola Carlos:
Los mensajes de error pasan directamente al cliente y el servidor de SQL
fija el numero de error en la variable global @@Error unicament, pero hasta
donde se no se deja el texto que envia y por ende NO debe ser posible
"parsearlo" en SQL. Podrias eso si revisar el numero de error y enviar un
mensaje personalizado pero sin el nombre de la Tabla.
Seria mucho mejor que trates de manejar el error en el cliente.
Si definitivamente NO puedes tendrias que hacer las revisiones de
integridad por codigo en cualquiera de las siguientes alternativas:
a) Triggers: Construir la Integridad en Triggers con manejo
personalizado de Errores.
b) Relanzamiento del Error: En el procedimiento almacenado una vez que
falla la integridad declarativa, revisar cual de las condiciones (Llave
Primaria, Check, Llave Foranea, etc.) fue la que se rompio, por codigo y en
caso de fallo enviar el error.
Las 2 alternativas son HORRIBLES, y no te recomiendo ninguna :(
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.
Carlos escribio:
Hola, estoy creando una SP que borra registros de una tabla siempre
que no estén referenciados desde otra, la cuestión es que necesito
capturar el mensaje que me da cuando intento borrar uno de estos
registros para informar en una tabla de log cual es la tabla que
contiene la referencia.
Me explico, si al intentar borrar un registro obtengo el mensaje:

Servidor: mensaje 547, nivel 16, estado 1, línea 11
DELETE statement conflicted with COLUMN REFERENCE constraint
'FK_COMPANIA_DIVISA'. The conflict occurred in database 'XSIX', table
'MST_COMPANIA', column 'COD_DIVISA'.
The statement has been terminated.

quisiera poder insertar en la tabla log_mensajes algo como:

"La divisa xx no se ha borrado porque se utiliza en la tabla
MST_COMPANIA"

pues bien, soy incapaz de obtener el nombre de la tabla o asignar el
string del mensaje (una vez rellenado por sqlserver, no el texto de
sysmessages) a una variable.

Gracias por vuestra ayuda de antemano.

Un saludo

Preguntas similares