Puoi sfruttare la pseudo tabella "eliminata" in questo esempio. Qualcosa come:
begin transaction;
declare @deletedIds table ( id int );
delete from t1
output deleted.id into @deletedIds
from table1 as t1
inner join table2 as t2
on t2.id = t1.id
inner join table3 as t3
on t3.id = t2.id;
delete from t2
from table2 as t2
inner join @deletedIds as d
on d.id = t2.id;
delete from t3
from table3 as t3 ...
commit transaction;
Ovviamente puoi fare un 'output cancellato.' anche al secondo elimina, se avevi bisogno di qualcosa su cui unirti per il terzo tavolo.
Come nota a margine, puoi anche inserire.* su una dichiarazione di inserimento, e sia inserito.* che cancellato.* su una dichiarazione di aggiornamento.
MODIFICA: Inoltre, hai considerato di aggiungere un trigger su table1 per eliminare da table2 + 3? Sarai all'interno di una transazione implicita e avrai anche "inserito." ed "eliminato. " pseudo-tabelle disponibili.