Я б застосував прагматичний підхід - історично головна «користь» від збереження бізнес-логіки у збережених документах є з міркувань продуктивності (2.5-ярусна архітектура), тоді як розділення ділової логіки на рівень BLL (3 / N-рівень), як правило, більш чистий від перспектива технічного обслуговування та простіша перевірка (макет / заглушка доступу до даних).
Однак, враховуючи, що з підтримкою LINQ .NET ORMS, такими як LINQ2SQL, EF та NHibernate, тепер створюються параметризовані запити SQL, де плани запитів можна кешувати, уникати для ін'єкції SQL тощо. більш переконливим, ніж будь-коли, і більшості SPROC (особливо орієнтованих на запити) можна взагалі уникнути. Шаблони репозиторіїв у .NET зазвичай піддають IQueryable / accept параметрів дерева Expression, що забезпечує безпечний тип, але гнучкий доступ до ваших таблиць. (Особисто в архітектурах типу SOA я б не виставляв IQueryable за межами BLL, тобто ваші рівні обслуговування та презентації повинні працювати з чітко визначеним набором методів. Причина полягає в тому, що в іншому випадку ви ніколи не можете повністю протестувати свою систему, і ви виграли '
Однак у системі пристойного розміру завжди буде кілька винятків, коли дійсно інтенсивний фрагмент коду, можливо, все ж повинен бути записаний як Stored Proc з міркувань продуктивності. У цих випадках я б утримував SPROC і викривав би SPROC через ORM, але все-таки викривав би функцію як метод проходження у вашому BLL.