私は実用的なアプローチを採用します-歴史的に、ストアドプロシージャにビジネスロジックを保持する主な「メリット」はパフォーマンス上の理由(2.5層アーキテクチャ)ですが、ビジネスロジックをBLL層(3 / N層)に分離することは一般的にメンテナンスの観点、およびテストが容易です(データアクセスのモック/スタブ)。
ただし、LINQ2SQL、EF、NHibernateなどのLINQ対応の.NET ORMSが、SQLインジェクションなどのためにクエリプランをキャッシュできるエスケープされたパラメーター化されたSQLクエリを作成することを考えると、3 / N層アーキテクチャへの移行はかつてないほど魅力的であり、ほとんどのSPROC(特にクエリ中心のSPROC)は完全に回避できます。.NETのリポジトリパターンは通常、IQueryableを公開し、式ツリーのパラメーターを受け入れて、タイプセーフでありながらテーブルへの柔軟なアクセスを可能にします。(個人的にSOAタイプのアーキテクチャでは、IQueryableをBLL以外に公開しません。つまり、サービス層とプレゼンテーション層は明確に定義された一連のメソッドで動作するはずです。理由は、そうしないとシステムを完全にテストできないためです」
ただし、まともなサイズのシステムでは、常にいくつかの例外があります。パフォーマンス上の理由から、実際にはデータを集中的に使用するコードをストアドプロシージャとして記述する必要がある場合があります。これらのインスタンスでは、SPROCを保持し、ORMを介してSPROCを公開しますが、BLLのパススルーメソッドとして関数を公開します。