Я настоятельно рекомендую использовать блоки TRY / CATCH и RAISERROR вместо @@ ERROR / @ проверки результатов. У меня есть запись в блоге, которая показывает, как правильно использовать транзакции и блоки TRY / CATCH, включая вложенные транзакции, чтобы отменить только неудачный вызов процедуры, чтобы клиент мог возобновить другой путь и продолжить транзакцию, если он чувствует, что: Обработка исключений и вложенные транзакции .
Вы не согласны с режимом возврата процедур. UpdateTHIS и UpdateTHAT возвращают 0/1 в качестве возвращаемого значения, тогда как оболочка DoStuff возвращает в качестве набора результатов (SELECT). Это означает, что вы не можете написать DoMoreStuff, который вызывает DoStuff, потому что он должен использовать INSERT ... EXEC для захвата результата, и вы быстро обнаружите, что INSERT ... EXEC не может вкладываться. Вместо этого я рекомендую использовать RETURN @result для согласованности.
У меня также есть несвязанная похвала, которая является просто элементом стиля: я считаю, что длинные IF ... ELSE IF ... ELSE IF ... ELSE IF ... блоки трудно читать и следовать. Я всегда обнаруживал, что выражение, аналогичное выражению DO ... BREAK ... BREAK ... BREAK ... WHILE (FALSE) легче читать. В T-SQL нет конструкции DO ... WHILE, поэтому вместо нее нужно использовать WHILE ...:
BEGIN TRANSACTION
WHILE (1=1)
BEGIN
EXECUTE @result = dbo.UpdateTHIS @ID = 1;
IF @result != 0
BEGIN
ROLLBACK;
BREAK;
END
EXECUTE @result = dbo.UpdateTHAT @ID = 21
IF @result != 0
BEGIN
ROLLBACK;
BREAK;
END
...
COMMIT;
BREAK;
END
Опять же, это не важно, так как это просто стиль форматирования кода, но это предложение, если вы согласны с тем, что в результате получается код, который легче читать.