SQL dinámico es la única forma de hacer esto, pero reconsideraría la arquitectura de su aplicación si lo requiere. SQL no es muy bueno en el código "generalizado". Funciona mejor cuando está diseñado y codificado para realizar tareas individuales.
Seleccionar de TableA no es lo mismo que seleccionar de TableB, incluso si las declaraciones de selección tienen el mismo aspecto. Puede haber diferentes índices, diferentes tamaños de tablas, distribución de datos, etc.
Podría generar sus procedimientos almacenados individuales, que es un enfoque común. Tenga un generador de código que cree los diversos procedimientos almacenados seleccionados para las tablas que necesita. Cada tabla tendría sus propios SP, que luego podría vincular a su aplicación.
He escrito este tipo de generadores en T-SQL, pero podría hacerlo fácilmente con la mayoría de los lenguajes de programación. Es algo bastante básico.
Solo para agregar una cosa más, ya que Scott E mencionó los ORM... también debería poder usar estos procedimientos almacenados con los ORM más sofisticados.