11

Quiero saber si es posible o no suprimir una transacción dentro de un procedimiento almacenado SQL. Tengo la siguiente situación en mi SP (que yo quiero lograr):Suprimir transacción en procedimiento almacenado

WHILE TRUE 
BEGIN TRY 
    BEGIN TRANSACTION A 
    RECEIVE MESSAGE FROM SSB QUEUE WITH TIMEOUT 

    BEGIN SUPPRESS TRANSACTION 
     WHILE RECORD IN TABLE 
     BEGIN TRANSACTION B 
      DELETE RECORD FROM TABLE OUTPUT RECORD INTO D 
      SEND RECORD D TO OTHER SSB QUEUE 
     COMMIT TRANSACTION B 
    END SUPPRESS TRANSACTION 
    COMMIT TRANSACTION A 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION A 
END CATCH 

así que lo que realmente quiero hacer es que la transacción B no consigue alistó en la transacción A :)

+0

Buen momento señor, estaba a punto de publicar esto ... y parece que estaba trabajando en un problema muy similar dado su código :) – amarsuperstar

Respuesta

10

Eres describiendo una "transacción autónoma", que es una pregunta común de las personas que migran de Oracle (que los admite) a MSSQL (que no). This article explica las diversas opciones, que lamentablemente no son particularmente atractivos:

  1. Un bucle de retorno servidor vinculado
  2. Una conexión de bucle de retorno de un procedimiento CLR
  3. una variable de tabla que almacena los datos, ya que no se ven afectados por reversiones
  4. una conexión de bucle de retorno de un procedimiento almacenado extendido (pero que de todos modos están en desuso en favor de procedimientos CLR)

Si ninguno o Si esas opciones son prácticas para usted, la otra alternativa es cambiar algún control en una aplicación y fuera de la base de datos, pero, por supuesto, eso simplemente cambia el problema a otra ubicación. Aún así, puede valer la pena considerarlo.

Cuestiones relacionadas