Suprimir transacción en procedimiento almacenado

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 quiero lograr):

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 

entonces, lo que realmente quiero hacer es que la transacción B no se enlist en la transacción A 🙂

Está describiendo una "transacción autónoma", que es una pregunta común de las personas que migran de Oracle (que las admite) a MSSQL (que no). Este artículo explica las diversas opciones, que desafortunadamente no son particularmente atractivas:

  1. Un server vinculado de bucle invertido
  2. Una connection de bucle invertido desde un procedimiento CLR
  3. Una variable de tabla que almacena los datos, porque no se ven afectados por retrocesos
  4. Una connection de bucle invertido de un procedimiento almacenado extendido (pero están en desuso en cualquier caso a favor de los procedimientos CLR)

Si ninguna de esas opciones es práctica para usted, la otra alternativa es cambiar algún control en una aplicación y fuera de la database, pero por supuesto eso simplemente cambia el problema a otra location. Aún así, puede valer la pena considerarlo.