Dynamic SQL è l'unico modo per farlo, ma riconsidererei l'architettura della tua applicazione se lo richiede. SQL non è molto bravo con il codice "generalizzato". Funziona meglio quando è progettato e codificato per svolgere attività individuali.
Selezionare da TableA non equivale a selezionare da TableB, anche se le istruzioni select hanno lo stesso aspetto. Potrebbero esserci indici diversi, dimensioni delle tabelle diverse, distribuzione dei dati, ecc.
È possibile generare le proprie procedure memorizzate individuali, che è un approccio comune. Avere un generatore di codice che crea le varie stored procedure selezionate per le tabelle di cui hai bisogno. Ogni tabella avrà i suoi SP, che potresti quindi collegare alla tua applicazione.
Ho scritto questo tipo di generatori in T-SQL, ma potresti farlo facilmente con la maggior parte dei linguaggi di programmazione. È roba piuttosto semplice.
Solo per aggiungere un'altra cosa da quando Scott E ha sollevato gli ORM... dovresti anche essere in grado di utilizzare queste procedure memorizzate con gli ORM più sofisticati.