Avez-vous essayé de définir XACT_ABORT
activé au début de votre script ?
SET XACT_ABORT ON
Sans rapport, mais la boucle ne pourrait-elle pas être écrite comme :
-- Continue looping while rows exist
WHILE EXISTS (SELECT 1 FROM [LINKEDSERVER].MasterDatabase.dbo.Logging WITH(NOLOCK)
WHERE [Date] < @ArchiveDate)
Ou encore mieux, réécrivez afin de ne pas toucher la table liée deux fois par itération de boucle.