Eu adotaria uma abordagem pragmática - historicamente, o principal 'benefício' de manter a lógica de negócios em procs armazenados é por razões de desempenho (arquitetura de 2,5 camadas), enquanto separar a lógica de negócios em uma camada de BLL (camada 3 / N) geralmente é mais limpa de uma perspectiva de manutenção e mais fácil de testar (simule / desconecte o acesso a dados).
No entanto, como os ORMS .NET habilitados para LINQ, como LINQ2SQL, EF e NHibernate, agora criam consultas SQL parametrizadas, nas quais os planos de consulta podem ser armazenados em cache, são escapados para a Injeção SQL, etc. mais convincente do que nunca, e a maioria dos SPROCs (especialmente os centrados em consultas) podem ser totalmente evitados. Os padrões de repositório no .NET normalmente expõem os parâmetros da árvore IQueryable / accept Expression, permitindo um tipo de acesso seguro e flexível às suas tabelas. (Pessoalmente, nas arquiteturas do tipo SOA, eu não exporia o IQueryable além da BLL, ou seja, suas camadas de Serviço e Apresentação devem funcionar com um conjunto de métodos bem definido. O motivo é que, caso contrário, você nunca poderá testar completamente o seu sistema e você ganhará '
No entanto, em um sistema de tamanho decente, sempre haverá algumas exceções, nas quais um código realmente intensivo em dados ainda precisa ser gravado como um Proc armazenado por motivos de desempenho. Nesses casos, eu manteria o SPROC e o exporia através do ORM, mas ainda assim exporia a função como um método de passagem na sua BLL.