É menos no SQL Server 2008 e superior, mas ainda está lá. O que se resume é o cache do plano de execução e o SQL Server poder parametrizar automaticamente as consultas enviadas. Ao usar procedimentos armazenados (que não possuem SQL dinâmico), as consultas já estão parametrizadas para que o SQL Server não ' não é necessário gerar um plano para cada consulta quando ela for executada, pois os planos já estão armazenados no cache do plano.
E não se esqueça dos problemas de segurança (SQL dinâmico, permissões mínimas etc.) que desaparecem ao usar procedimentos armazenados.
Quando o aplicativo está usando SQL dinâmico nas tabelas base para selecionar, inserir, atualizar e excluir os dados nas tabelas, o aplicativo precisa ter direitos sobre todos esses objetos diretamente. Portanto, se alguém usar o SQL Injection para acessar o servidor, ele terá o direito de consultar, alterar ou excluir todos os dados nessas tabelas.
Se você estiver usando procedimentos armazenados, eles terão apenas o direito de executar os procedimentos armazenados, retornando apenas as informações que o procedimento armazenado retornaria. Em vez de emitir uma instrução de exclusão rápida e remover tudo, eles precisariam descobrir quais procedimentos podem ser usados para excluir dados e descobrir como usar o procedimento para fazer isso.
Dado que a injeção de SQL é a maneira mais fácil de invadir um banco de dados, isso é meio importante.