Adottare un approccio pragmatico: storicamente il principale "vantaggio" di mantenere la logica aziendale nei processi memorizzati è per motivi di prestazioni (architettura a livelli 2.5), mentre la separazione della logica aziendale in un livello BLL (livello 3 / N) è generalmente più pulito dal punto di vista della manutenzione e più facile da testare (Mock / Stub out l'accesso ai dati).
Tuttavia, dato che gli ORMS .NET abilitati LINQ come LINQ2SQL, EF e NHibernate ora creano query SQL parametrizzate, dove i piani di query possono essere memorizzati nella cache, sono sfuggiti per SQL Injection ecc, direi che il passaggio verso 3 / N l'architettura di livello è più avvincente che mai e la maggior parte degli SPROC (specialmente quelli basati su query) possono essere evitati del tutto. I modelli di repository in .NET espongono in genere IQueryable / accept Parametri dell'albero di espressione, consentendo un accesso sicuro, ma flessibile alle tabelle. (Personalmente in architetture di tipo SOA, non esporrei IQueryable oltre il BLL, cioè i tuoi livelli di servizio e di presentazione dovrebbero funzionare con un insieme ben definito di metodi.) La ragione è che altrimenti non puoi mai testare completamente il tuo sistema, e non lo farai dormire bene di notte sapendo che alcune query arbitrarie emesse da un client potrebbero colpire il DB senza colpire indici ecc.
Tuttavia, in un sistema di dimensioni decenti, ci saranno sempre alcune eccezioni, in cui un pezzo di codice realmente intensivo di dati potrebbe ancora essere scritto come Proc. memorizzato per motivi di prestazioni. In questi casi manterrei SPROC ed esporremo il SPROC attraverso l'ORM, ma espongo comunque la funzione come metodo pass-through sul tuo BLL.