@@error en procedure

11/11/2003 - 16:49 por luis_mtz | Informe spam
saludos!

Tengo un procedimiento almacenado, que agrega registros
a una tabla, la tabla y el procedimiento tienen las
siguientes estructuras...

CREATE TABLE almacen
(
alm_cla int IDENTITY not Null PRIMARY KEY,
alm_des varchar(50) not null CONSTRAINT
ck_almacen_alm_des_novacio CHECK (alm_des<>'')
)


CREATE PROC pduinsertalmacen @descripcion varchar
(50),@lnid int OUTPUT,@lnerror int OUTPUT as
INSERT INTO almacen (alm_des) VALUES (@descripcion)
SET @lnerror=@@error
SET @lnid=@@IDENTITY



En este caso yo espero que el procedimiento me devuelva el
valor IDENTITY el cual si me lo devuelve cuando se inserta
un registro. Cuando intencionalmente intento agregar un
registro en blanco (con el procedimiento) se activa la
restriccion de la tabla y yo espero la funcion @@error me
devuelva el numero de error que corresponde, pero el valor
no es devuelto, de hecho me sucede como si no existiera la
linea SET @lnerror=@@error lo curioso es que la funcion
identity funciona sin problema. No se si sea que la
funcion error no tome el error por esta restriccion.

SQL-Server 2000 Desktop Engine(MSDE)

Gracias.

luis_mtz

Preguntas similare

Leer las respuestas

#1 Accotto Maximiliano D.
11/11/2003 - 18:37 | Informe spam
si pruebas en lugar de retornar algo q muestre con un select el @@error que
te da?

ej:

Select @@error

Accotto Maximiliano Damian
"luis_mtz" escribió en el mensaje
news:015601c3a86b$6b91a520$

saludos!

Tengo un procedimiento almacenado, que agrega registros
a una tabla, la tabla y el procedimiento tienen las
siguientes estructuras...

CREATE TABLE almacen
(
alm_cla int IDENTITY not Null PRIMARY KEY,
alm_des varchar(50) not null CONSTRAINT
ck_almacen_alm_des_novacio CHECK (alm_des<>'')
)


CREATE PROC pduinsertalmacen @descripcion varchar
(50),@lnid int OUTPUT,@lnerror int OUTPUT as
INSERT INTO almacen (alm_des) VALUES (@descripcion)
SET @lnerror=@@error
SET @lnid=@@IDENTITY



En este caso yo espero que el procedimiento me devuelva el
valor IDENTITY el cual si me lo devuelve cuando se inserta
un registro. Cuando intencionalmente intento agregar un
registro en blanco (con el procedimiento) se activa la
restriccion de la tabla y yo espero la funcion @@error me
devuelva el numero de error que corresponde, pero el valor
no es devuelto, de hecho me sucede como si no existiera la
linea SET @lnerror=@@error lo curioso es que la funcion
identity funciona sin problema. No se si sea que la
funcion error no tome el error por esta restriccion.

SQL-Server 2000 Desktop Engine(MSDE)

Gracias.

luis_mtz
Respuesta Responder a este mensaje
#2 Javier Loria
11/11/2003 - 18:46 | Informe spam
Hola Luis:
El Identity NO soporta transacciones, cuando haces el INSERT, ocurre lo
siguiente:
a) se crea automaticamente una trasaccion,
b) se incremente el valor de Identity
c) se inserta la fila y como hay una restriccion sobre la columna falla,
d) se produce el Rollback,
e) Ya es demasiado tarde para el Identity, fue incrementado.

Si deseas seguir utilizando la columna alm_cla (que asumo no es una
llave natural), podrias quitar el Identity y hacer algo como:

INSERT INTO almacen (alm_cla,alm_des)
VALUES (
(SELECT COALESCE(MAX(alm_cla), 0)+1
FROM alm_cla)
,@descripcion)

Si tienes alguna llave natural (asumo que alm_des) ,entonces puedes hacer:
SELECT @lnid=alm_cla
FROM Almacenes
WHERE alm_des=@alm_des
Si no tienes una llave natural es mas dificil.
En tu caso SI NO quieres quitar el IDENTITY, (no se puede ser que
pertenezcal a algun culto 1/2 extrano), podrias cambiar la logica del
procedimiento que es revisar primero y luego insertar, algo como

IF @alm_des=''
BEGIN
END
ELSE
BEGIN
END

Claro es hacer las cosas 2 veces, en el Proc y en el CHECK.

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.



luis_mtz escribio:
saludos!

Tengo un procedimiento almacenado, que agrega registros
a una tabla, la tabla y el procedimiento tienen las
siguientes estructuras...

CREATE TABLE almacen
(
alm_cla int IDENTITY not Null PRIMARY KEY,
alm_des varchar(50) not null CONSTRAINT
ck_almacen_alm_des_novacio CHECK (alm_des<>'')
)


CREATE PROC pduinsertalmacen @descripcion varchar
(50),@lnid int OUTPUT,@lnerror int OUTPUT as
INSERT INTO almacen (alm_des) VALUES (@descripcion)
SET @lnerror=@@error
SET @lnid=@@IDENTITY



En este caso yo espero que el procedimiento me devuelva el
valor IDENTITY el cual si me lo devuelve cuando se inserta
un registro. Cuando intencionalmente intento agregar un
registro en blanco (con el procedimiento) se activa la
restriccion de la tabla y yo espero la funcion @@error me
devuelva el numero de error que corresponde, pero el valor
no es devuelto, de hecho me sucede como si no existiera la
linea SET @lnerror=@@error lo curioso es que la funcion
identity funciona sin problema. No se si sea que la
funcion error no tome el error por esta restriccion.

SQL-Server 2000 Desktop Engine(MSDE)

Gracias.

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