2011-03-13 13 views
5

Con el fin para envolver procedimiento almacenado en una transacción añado lo siguiente: Yatransacción tsql

CREATE PROCEDURE [dbo].[P_ORD_InsertTextField] 
    //PARAMS 
AS 
BEGIN 
    BEGIN TRY 
    BEGIN TRANSACTION 

    //STP BODY 

    COMMIT 
    END TRY 
    BEGIN CATCH 
     IF @@TRANCOUNT > 0 
     ROLLBACK 

     DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int 
     SELECT @ErrMsg = ERROR_MESSAGE(), 
      @ErrSeverity = ERROR_SEVERITY() 

     RAISERROR(@ErrMsg, @ErrSeverity, 1) 
    END CATCH 
END 
GO 

alguna manera más corto que hace lo mismo? este es un gran bloque de código para "solo" manejar una transacción ..

Respuesta

4

No, esto es más o menos.

Puede ocultar el procesamiento @ErrMsg detrás de un proceso almacenado o UDF, y no necesita el proceso @ErrSeverity. Normalmente es 16, que es "error definido por el usuario"

Véase mi respuesta también aquí por favor: Nested stored procedures containing TRY CATCH ROLLBACK pattern?

+0

@gbn: ¿Cuál es la razón para no cuentan en su respuesta? – Naor

+1

@Naor: las "xx filas afectadas" devuelve un conjunto de registros adicional al cliente. También rompe algunos ORM y algunos clientes. Consulte mi pregunta aquí http://stackoverflow.com/q/1483732/27535 – gbn

+0

@gbn: ¿Así que pone SET NOCOUNT en cada procedimiento almacenado que tiene? – Naor

Cuestiones relacionadas