Я полагаю, что нет никакого чистого способа достижения чего-либо другого, кроме динамических запросов.
CTE - это хороший способ лучше структурировать ваш запрос и преобразовать его в блоки многократного использования, но, опять же, он не является динамическим в этом смысле!
Любой подход, предусматривающий передачу списка строк столбцов или предложения WHERE для анализа и выполнения, не поддерживается непосредственно на сервере Sql и поэтому должен выполняться с использованием хранимой процедуры SP_EXECUTESQL.
Ситуации, требующие динамического запроса, очень редки. Если вы широко используете этот подход, то вам придется пересматривать свои запросы, потому что большинство запросов могут быть написаны на обычном Sql.
Это мои 2 цента на этом.