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.

Preguntas similare

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.



Respuesta Responder a este mensaje
#2 Paulino Padial
02/11/2004 - 22:39 | Informe spam
La verdad, yo he mirado la logica de las insercciones, y vamos solo he
sacado fuera la primera declaracion de la variable :P

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
declare @id_pedido int
BEGIN TRAN

insert into TBL_PEDIDOS (ped_observacion,pedt_id)
values (@pped_observacion,@ppedt_id)

set @id_pedido = @@IDENTITY

IF @@ERROR <> 0
ROLLBACK TRAN


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
ROLLBACK TRAN


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
ROLLBACK TRAN


-
-

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

IF @@ERROR <> 0
ROLLBACK TRAN


COMMIT TRAN
GO

Saludos Cordiales

Paulino Padial Lopez
Microsoft MCSD
Database Administrator
"Oterox" escribió en el mensaje
news:
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.


Respuesta Responder a este mensaje
#3 Guillermo Roldán
02/11/2004 - 22:46 | Informe spam
Hola Oterox,

Si no me equivoco, @@ERROR te indica el éxito de la última instrucción
ejecutada... y no de la penúltima o de anteriores.

Por ello, en el procedimiento pedidos_grabarPedido, deberías alterarlo para
ser algo así:

insert into TBL_PEDIDOS (ped_observacion,pedt_id )
values (@pped_observacion,@ppedt_id )
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
END

set @id_pedido = @@IDENTITY

Sino, corres el riesgo de que el @@ERROR te registre el error de la
instrucción set @id_pedido = @@IDENTITY, en vez de si hubo error en el
INSERT.

Si no recuerdo mal, es así.

Saludos,

Guillermo Roldán
MCDBA, MCSE, MCSA
Madrid - Spain





"Oterox" escribió en el mensaje
news:
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.


Respuesta Responder a este mensaje
#4 Paulino Padial
02/11/2004 - 22:47 | Informe spam
pues si , lleva razon, yo no habia mirado eso, solamente si los bloques try
estaban bien encapsulados :P.
Del riego.
Lo siento T___T

Saludos Cordiales

Paulino Padial Lopez
Microsoft MCSD
Database Administrator
"Paulino Padial" escribió en el mensaje
news:
La verdad, yo he mirado la logica de las insercciones, y vamos solo he
sacado fuera la primera declaracion de la variable :P

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
declare @id_pedido int
BEGIN TRAN

insert into TBL_PEDIDOS (ped_observacion,pedt_id)
values (@pped_observacion,@ppedt_id)

set @id_pedido = @@IDENTITY

IF @@ERROR <> 0
ROLLBACK TRAN


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
ROLLBACK TRAN


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
ROLLBACK TRAN



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

IF @@ERROR <> 0
ROLLBACK TRAN


COMMIT TRAN
GO

Saludos Cordiales

Paulino Padial Lopez
Microsoft MCSD
Database Administrator
"Oterox" escribió en el mensaje
news:
> 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.
>
>


Respuesta Responder a este mensaje
#5 Oterox
03/11/2004 - 11:36 | Informe spam
Entonces lo priemro que deberia hacer es poner los return en cada bloque
para ver si falla :

IF @@ERROR <> 0
BEGIN
RETURN 1001 -- Si devuelve 1001 ha fallado en ARTICULOS
ROLLBACK TRAN
END

IF @@ERROR <> 0
BEGIN
RETURN 1002 -- Si devuelve 1001 ha fallado en CONSIGNATARIOS
ROLLBACK TRAN
END

Y asi en todos no?

Muchas gracias a todos por vuestra ayuda :-)


"Oterox" wrote in message
news:
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.


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