Es como la mayoría de las funciones de dbms, si lo usa en la situación correcta, funciona bien, la situación incorrecta lo hace mal.
Pros: Algunas cosas simplemente no se pueden hacer sin ella. Por lo general, solo he encontrado que esto es para el trabajo administrativo, y no para el código de la aplicación. Algunos comandos del sistema no permiten que los parámetros se utilicen como entrada. Entonces, por ejemplo, si necesito ejecutar algo a través de un sproc en cada base de datos, en muchas instancias con bases de datos desconocidas, y el comando no acepta parámetros, generalmente lo resuelvo a través de SQL dinámico. Sin embargo, esto es más importante en Sybase ASE que en MSSQL.
Contras: no voy a entrar mucho en eso, ya que creo que todos ya lo sabemos, pero puede haber algún riesgo para la inyección de SQL si se usa incorrectamente. El más grande para mí es que la consulta se tratará como lo que es, una consulta ad hoc única y no formará parte del plan de consulta compilado. Para algo que se ejecuta ocasionalmente, no es gran cosa. Para algo que se ejecuta cientos de veces por minuto y que va a tener una gran cantidad de sql únicos, generaría muchos planes de consulta nuevos y potencialmente innecesarios, consumiendo ciclos y acortando el tiempo válido del caché del plan.