Atrapar Error de SQL Server

07/07/2004 - 10:32 por Serafin Salazar | Informe spam
Hola, tengo un procedimiento que elimina registros de una tabla. Esta tabla
es referenciada por otras, lo que desea es que si se esta violando alguna
regla de integridad referencial como foreign key, el procedimiento me
devuelva el codigo de error, de tal manera que en una pagina asp pueda, de
acuerdo al error retornado, mostrar un mensaje amigable al usuario.
Lo que tengo es lo siguiente:


create proc proc_Delete
as
begin
set nocount on
declare @mierror integer
select @mierror=0
begin tran a
delete from caf_warnings_state where ws_key2
set @mierror=@@error
if @mierror<>0
begin
rollback tran a
goto salir
end
commit tran a
salir:
return (@mierror)
end

y lo estoy invocando asi:

declare @salida int
exec @salida =proc_Delete
select @salida

pero no me devuelve unicamente el codigo de error, y obtengo problemas desde
la pagina con todo ese texto extra...alguna ayuda por favor.

Mil gracias!
 

Leer las respuestas

#1 Serafin Salazar
07/07/2004 - 14:31 | Informe spam
Hola Javier, si estoy usando ADO desde ASP. Pero me genera un error al
tratar de Ejecutar el procedimiento almacenado de esta forma:


sql=" declare @salida int" & _ " exec @salida =proc_Delete" & _ " select
@salida " set rs=conn.execute(sql) response.Write rs(0)

Ni siquiera ejecuta el sql, me muestra el mismo error de llave foranea

Microsoft OLE DB Provider for SQL Server (0x80040E2F)
Instrucción DELETE en conflicto con la restricción COLUMN REFERENCE
'fkprueba'. El conflicto ha aparecido en la base de datos 'DEV02BVS', tabla
'caf_warnings_stage', column 'wst_ws_key'.
/dev02bvs/pruebapalm.asp, line 37



"Javier Loria" escribió en el mensaje
news:%
Hola:
Asumo que en la pagina asp estas usando ADO, si es asi en el objeto
conexion existe una coleccion errors, debes buscar en esta coleccion el
error. El objeto error tiene un numero NativeError que es el numero de


error
de SQL.
Personalmente prefiero personalizar los mensajes en la aplicacion


(como
estas haciendo), pero tambien es posible personalizarlo en SQL. Para esto
puedes hacer un RAISERROR.
=> IF EXIST (SELECT *
FROM TablaReferenciada
WHERE Columna=@Valor)
BEGIN
RAISERROR('El codigo %s, se esta usando en X ',
16, 1, @Valor)
END
=> 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.

Serafin Salazar escribio:
> Hola, tengo un procedimiento que elimina registros de una tabla. Esta
> tabla es referenciada por otras, lo que desea es que si se esta
> violando alguna regla de integridad referencial como foreign key, el
> procedimiento me devuelva el codigo de error, de tal manera que en
> una pagina asp pueda, de acuerdo al error retornado, mostrar un
> mensaje amigable al usuario.
> Lo que tengo es lo siguiente:
>
>
> create proc proc_Delete
> as
> begin
> set nocount on
> declare @mierror integer
> select @mierror=0
> begin tran a
> delete from caf_warnings_state where ws_key2
> set @mierror=@@error
> if @mierror<>0
> begin
> rollback tran a
> goto salir
> end
> commit tran a
> salir:
> return (@mierror)
> end
>
> y lo estoy invocando asi:
>
> declare @salida int
> exec @salida =proc_Delete
> select @salida
>
> pero no me devuelve unicamente el codigo de error, y obtengo
> problemas desde la pagina con todo ese texto extra...alguna ayuda por
> favor.
>
> Mil gracias!


Preguntas similares