Dynamic SQL est le seul moyen de le faire, mais je reconsidérerais l'architecture de votre application si cela l'exige. SQL n'est pas très doué pour le code "généralisé". Il fonctionne mieux lorsqu'il est conçu et codé pour effectuer des tâches individuelles.
La sélection à partir de TableA n'est pas la même chose que la sélection à partir de TableB, même si les instructions de sélection se ressemblent. Il peut y avoir différents index, différentes tailles de table, différentes distributions de données, etc.
Vous pouvez générer vos procédures stockées individuelles, ce qui est une approche courante. Avoir un générateur de code qui crée les différentes procédures stockées de sélection pour les tables dont vous avez besoin. Chaque table aurait son ou ses propres SP, que vous pourriez ensuite lier à votre application.
J'ai écrit ces types de générateurs en T-SQL, mais vous pouvez facilement le faire avec la plupart des langages de programmation. C'est assez basique.
Juste pour ajouter une dernière chose depuis que Scott E a évoqué les ORM... vous devriez également pouvoir utiliser ces procédures stockées avec les ORM les plus sophistiqués.