Es menos en SQL Server 2008 y superior, pero todavía está allí. Todo se reduce a que el caché del plan de ejecución y SQL Server pueden parametrizar automáticamente las consultas que se envían. Cuando se utilizan procedimientos almacenados (que no tienen SQL dinámico dentro de ellos) las consultas ya están parametrizadas, por lo que SQL Server no No es necesario generar un plan para cada consulta cuando se ejecuta, ya que los planes ya están almacenados en la caché del plan.
Y no se olvide de los problemas de seguridad (SQL dinámico, permisos mínimos, etc.) que desaparecen al usar procedimientos almacenados.
Cuando la aplicación usa SQL dinámico contra las tablas base para seleccionar, insertar, actualizar y eliminar los datos en las tablas, la aplicación necesita tener derechos sobre todos esos objetos directamente. Entonces, si alguien usa la Inyección SQL para ingresar al servidor, tendrá derechos para consultar, cambiar o eliminar todos los datos en esas tablas.
Si está utilizando procedimientos almacenados, solo tienen los derechos para ejecutar los procedimientos almacenados recuperando solo la información que devolvería el procedimiento almacenado. En lugar de emitir una declaración de eliminación rápida y eliminar todo, tendrían que averiguar qué procedimientos se pueden usar para eliminar datos y luego averiguar cómo usar el procedimiento para hacerlo.
Dado que la inyección SQL es la forma más fácil de ingresar a una base de datos, esto es algo importante.