transacciones en procedimiento almacenado

02/11/2004 - 17:42 por Oterox | Informe spam
Hola a todos.
Gracias a vuestra ayuda he conseguido q funcione el procedimiento pero no
estoy seguro si estoy haciendo las transacciones de la manera correcta.Como
se podria mejorar el procedimiento?
El codigo esta un poco sucio y seguramente no muy bien hecho ;-):

CREATE PROC [sam_user].[pedidos_grabarPedido]

@xmlPedido nText, -- XML con los datos del pedido
@pped_observacion varchar(50), -- Observaciones
@ppedt_id varchar(50) -- Tipo de pedido


AS
BEGIN TRAN

declare @id_pedido int

insert into TBL_PEDIDOS
(
ped_observacion,
pedt_id
)
values
(
@pped_observacion,
@ppedt_id
)
set @id_pedido = @@IDENTITY

IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN


END





articulos
-
Declare @hDoc int
exec sp_xml_preparedocument @hDoc OUTPUT,@xmlPedido

Insert Into TBL_PEDIDOS_ARTICULOS
SELECT @id_pedido , (select art_id from tbl_articulos where art_codigo XMLArticulos.art_codigo), pedart_cantidad
FROM OPENXML (@hdoc, '/rootPedido/CONSULTA/CONSULTA',2)
WITH (art_codigo varchar(10) , pedart_cantidad varchar(100))
XMLArticulos

EXEC sp_xml_removedocument @hDoc

IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN


END



Consignatarios -

Declare @hDocC int
exec sp_xml_preparedocument @hDocC OUTPUT,@xmlPedido

Insert Into TBL_PEDIDOS_CONSIGNATARIOS
SELECT @id_pedido , (select con_id from tbl_consignatarios where
con_codDelegado = XMLConsignatarios.con_codDelegado)
FROM OPENXML (@hDocC, '/rootPedido/Pedidos/Consignatarios',2)
WITH (con_codDelegado varchar(10)) XMLConsignatarios

EXEC sp_xml_removedocument @hDocC

IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
END


-
-
INSERT INTO TBL_PEDIDOS_ARTICULOS_CONSIGNATARIOS
select * from vPedidos_Articulos_Consignatarios where ped_id=@id_pedido

IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
END


COMMIT TRAN
GO



Muchas gracias a todos.
 

Leer las respuestas

#1 Miguel Egea
02/11/2004 - 22:28 | Informe spam
Efectivamente no es un buen mecanismo, te propongo esto para que compruebes
por qué. despues de un rollback deberías hacer un return, por otra parte, si
hace un rollback el @@trancount queda a cero, esto puede provocar que si otro
procedimiento ha llamado a este obtengas un mensaje del tipo que no coinciden
el número de transacciones antes y después. Creo que esto te ayude a entender
por que, y por tanto a corregirlo.

Saludos
create table test (id int primary key )
go
create proc a as
begin
begin tran
insert into test (id) values (1)
if @@error!=0
rollback tran
insert into test (id) values (1)
if @@error!=0
rollback tran
insert into test (id) values (2)
if @@error!=0
rollback tran
insert into test (id) values (2)
if @@error!=0
rollback tran
insert into test (id) values (3)
if @@error!=0
rollback tran
insert into test (id) values (3)
if @@error!=0
rollback tran
commit tran
end

go
exec a
go
select * From test



"Oterox" escribió:

Hola a todos.
Gracias a vuestra ayuda he conseguido q funcione el procedimiento pero no
estoy seguro si estoy haciendo las transacciones de la manera correcta.Como
se podria mejorar el procedimiento?
El codigo esta un poco sucio y seguramente no muy bien hecho ;-):

CREATE PROC [sam_user].[pedidos_grabarPedido]

@xmlPedido nText, -- XML con los datos del pedido
@pped_observacion varchar(50), -- Observaciones
@ppedt_id varchar(50) -- Tipo de pedido


AS
BEGIN TRAN

declare @id_pedido int

insert into TBL_PEDIDOS
(
ped_observacion,
pedt_id
)
values
(
@pped_observacion,
@ppedt_id
)
set @id_pedido = @@IDENTITY

IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN


END





articulos
-
Declare @hDoc int
exec sp_xml_preparedocument @hDoc OUTPUT,@xmlPedido

Insert Into TBL_PEDIDOS_ARTICULOS
SELECT @id_pedido , (select art_id from tbl_articulos where art_codigo > XMLArticulos.art_codigo), pedart_cantidad
FROM OPENXML (@hdoc, '/rootPedido/CONSULTA/CONSULTA',2)
WITH (art_codigo varchar(10) , pedart_cantidad varchar(100))
XMLArticulos

EXEC sp_xml_removedocument @hDoc

IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN


END



Consignatarios -

Declare @hDocC int
exec sp_xml_preparedocument @hDocC OUTPUT,@xmlPedido

Insert Into TBL_PEDIDOS_CONSIGNATARIOS
SELECT @id_pedido , (select con_id from tbl_consignatarios where
con_codDelegado = XMLConsignatarios.con_codDelegado)
FROM OPENXML (@hDocC, '/rootPedido/Pedidos/Consignatarios',2)
WITH (con_codDelegado varchar(10)) XMLConsignatarios

EXEC sp_xml_removedocument @hDocC

IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
END


-
-
INSERT INTO TBL_PEDIDOS_ARTICULOS_CONSIGNATARIOS
select * from vPedidos_Articulos_Consignatarios where ped_id=@id_pedido

IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
END


COMMIT TRAN
GO



Muchas gracias a todos.



Preguntas similares