Вам нужно обернуть оба вызова в одну транзакцию.
если вы вызываете их в SQL, то это путь или использование более полной версии, как в другом ответе, который был дан 7 минут назад gbn.
create proc doall as
BEGIN TRY
BEGIN TRAN
EXECUTE SP1
EXECUTE SP1
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH;
если вы вызываете SP из другого источника , например из программы, отличной от SQL, вам нужно настроить внешнюю транзакцию, используя службу координатора распределенных транзакций Microsoft (MSDTC).
В зависимости от используемого вами API вы настраиваете транзакцию в Code, а затем фиксируете и откатываете в коде, в зависимости от условий.
например, в .net вы можете использовать пространство имен System.Transactions для создания распределенных транзакций.
В основной программе
var tran = new System.Transactions.Transaction();
.
.
.
in one piece of code doe a db call (and pass the tran object to the sql connection) so it enlists in the transaction... if it fails - abort the transaction (trans.Rollback())
.
.
.
.
in another piece of code do another db call (and pass the tran object to the sql connection) so it enlists in the transaction... if it fails - abort the transaction (trans.Rollback())
.
.
.
later...
if both pieces of code succeed commit the transaction
Этот является хорошим введением в это пространство имен, если вы используете .net