Когда вы используете EXEC
со строкой, команда выполняется в новом сеансе, поэтому переменные нельзя использовать для передачи аргументов или получения результатов. Однако вы можете создать временную таблицу, поместить в нее аргументы и использовать эту таблицу внутри динамического оператора:
create table #T (val_1 varchar(10), val_2 varchar(10), val_3 varchar(10));
insert into #T values ('abcef', 'ghijk', 'lmnopq');
declare @counter tinyint
set @counter = 1
while @counter<=3
begin
declare @sql_code varchar(max)
set @sql_code = '
declare @v varchar(10);
select @v = val_' + CONVERT(varchar(10), @counter) + ' FROM #T;
print @v;
'
print @sql_code
exec (@sql_code)
set @counter = @counter + 1
end