Технически это возможно путем передачи всех локальных переменных в sp_executesql:
declare @foo int
declare @bar int
declare @variable_name varchar(10)
set @variable_name = '@foo'
set @foo = 1;
set @bar = 2;
declare @sql nvarchar(max);
set @sql = N'SELECT ' + @variable_name;
exec sp_executesql @sql, N'@foo int, @bar int', @foo, @bar
Конечно, это было бы довольно сложно поддерживать в реальной жизни, вызов sp_executesql должен постоянно обновляться с помощью локальных переменных в текущем кадре (пакет или вызов процедуры). Хотя это несколько «универсально», вряд ли это лучше, чем использование большого CASE со всеми именами локальных переменных.