2012-08-20 26 views
17

Hola obtuve algunos procedimientos almacenados para crear productos y otras cosas en mi sitio. Ahora tengo que ejecutar algunos de ellos en una transacción. ¿Es posible o tengo que hacer un procedimiento almacenado solo para la transacción?SQL Server: transacción de procedimiento almacenado

¿Puedo decir algo como

BEGIN TRAN 
"1. stored procedure" 
"2. stored procedure" 
COMMIT 

Respuesta

37

para añadir a las otras respuestas anteriores, es posible que desee añadir un poco de control de errores:

BEGIN TRAN 

BEGIN TRY 

    EXEC P1 

    EXEC P2 

    COMMIT TRAN 

END TRY 
BEGIN CATCH 

    ROLLBACK TRAN 

END CATCH 

de actualización con el código C# (yo personalmente resulta mucho más fácil de mantener el código trans de los procedimientos almacenados y en la capa de datos - hace componer procedimientos almacenados más fácil en una etapa posterior):

using (var conn = new SqlConnection(...)) 

    trans = conn.BeginTransaction(); 

    try 
    { 
     ...call P1 using transaction 
     ...call P2 using transaction 

     trans.Commit(); 
    } 
    catch 
    { 
     trans.RollBack(); 
     throw; 
    } 
} 
+0

intente capturar que Gregs responde solo de una manera más fácil. ? él verifica cada valor de retorno y luego se detiene. si un dident devuelve 0. ¡gracias por la respuesta !. – saadan

+0

ahora lo tengo para trabajar con la captura de prueba pero si lo hago fallar puedo enviar un número de filas efectuadas o algo así para ver cuándo falla. – saadan

+0

Puedes enviar lo que necesites de la captura, ligeramente diferente de la respuesta de Gregs, digamos que necesitas agregar un tercer proceso, la respuesta if ... else se volvería rápidamente bastante compleja. Además, si falla, no se verán afectadas las filas, ¿lo está recuperando? – Paddy

2

partir de SQL Server (no estoy seguro acerca de otros RDBMS), puede llamar a varios procedimientos almacenados dentro de una transacción.

BEGIN TRAN 
EXEC StoredProc1 
EXEC StoredProc2 
COMMIT TRAN 

Es posible que desee añadir un código de retorno al procedimiento almacenado para comprobar si se debe ejecutar almacenado proc 2 si está almacenado proc 1 no

EDIT: Para comprobar un código de retorno que puede hacer algo como el seguimiento. Esto ejecutará el primer proceso almacenado. Si devuelve 0, ejecuta el 2do. Si el 2º devuelve 0, comete la transacción. Si bien devuelve un valor no 0 entonces será deshacer la transacción

DECLARE @ReturnValue INT 
BEGIN TRAN 
    EXEC @ReturnValue = StoredProc1 
    IF @ReturnValue = 0 
    BEGIN 
    EXEC @ReturnValue = StoredProc2 
    IF @ReturnValue = 0 
    BEGIN 
     COMMIT 
    END 
    ELSE 
    BEGIN 
     ROLLBACK 
    END 
    END 
    ELSE 
    BEGIN 
    ROLLBACK 
    END 
+0

debería haber añadido, si se almacena proc 2 falla, entonces será capaz para deshacer el proceso almacenado 1 – Greg

+0

así que si obtuve un código de retorno en storedproc1, ¿cómo puedo verificar el valor? lo siento, no soy bueno en sql. pero gracias por la ayuda – saadan

+0

@saadan, he actualizado mi respuesta con un ejemplo adicional – Greg

3

procsos Sí se puede ejecutar almacenados en la transacción, es tan simple como puede intentar ejecutar una consulta antes de publicar aquí

create table temp1 
(
    id int, 
    name varchar(20) 
) 

create table temp2 
(
    id int, 
    name varchar(20) 
) 
go 

create proc p1 as 
insert temp1 values (1, 'test1') 


create proc p2 as 
insert temp2 values (1, 'test2') 
go 

begin tran tx 
exec p1 
exec p2 
commit 
Cuestiones relacionadas