Правда ли, что в MS SQL Server создавать временные таблицы лучше вне транзакции?
Временные таблицы создают запись в базе tempdb. их надо проверять на существование, не забывать дропать и вообще они порой требовательны к коду, особенно для кода, который может сгенерировать исключение. 
Для одиночных инструкций(одного запроса SELECT,INSERT,UPDATE,DELETE) существует альтернатива - Обобщенные табличные выражения(CTE) - link
Разумеется если временная таблица вам нужна больше чем на 1 запрос - такой подход неприменим.
Ни разу не специалист по SQL (потому как fool stack developer), так что воспринимайте моё мнение критично. Но вопрос заинтересовал.
Не вижу причины отказываться от транзакций в C# коде, если это легаси проект. Наверняка там есть ещё чем заняться. Сам старался не использовать, хотя бывало. Зачастую, оборачивал группу хранимых процедур хранимкой с транзакцией, которую и вызывал из C#.
Зачем тащить создание временной таблицы в транзакцию? Из-за боязни, что она не очистится? Можно сделать пару хранимок создания и удаления глобальных временных таблиц с проверкой существования, которые вызывать до и после транзакции. Всегда придерживался точки зрения — чем меньше кода в транзакции, тем лучше.
Временные таблицы стараюсь не использовать. Хотя если объём временных данных большой и нужны индексы, почему нет. Бывало, что злоупотребление ими серьёзно просаживало производительность, бывало и наоборот. Недавно надо было предавать данные между базами одного инстанса. Сначала использовал временные таблицы. Потом, по совету архитектора, переписал и стал пересылать через xml параметр (там это хорошо вписывалось в общую канву).