Пока метки уникальны и допустимы для использования в качестве имен, ваш метод basi c будет работать. Обратите внимание, что имена ограничены 32 байтами, а метки могут быть длиной до 256 байтов. И чтобы использовать метки в вашем примере в качестве имен, вам нужно установить для параметра VALIDVARNAME значение ANY.
options validvarname=any;
Но вам нужно запросить фактическую таблицу метаданных, которая имеет переменные атрибуты, а не таблицу данных. Обратите внимание, что значения LIBNAME и MEMNAME в DICTIONARY.COLUMN всегда в верхнем регистре. Также вы не можете переименовать переменную в имя, которое у нее уже есть.
proc sql noprint;
%let rename=;
select catx('=',nliteral(name),nliteral(substr(coalesce(label,name),1,32)))
into :rename separated by ' '
from dictionary.columns
where libname='WORK' and memname='INST_CHAR8'
and name ne substr(coalesce(label,name),1,32)
;
%let num=&sqlobs ;
quit;
Быстрее просто изменить имена, используя PRO C DATASETS вместо копирования данных. Но если список переименований пуст, то вы получите сообщение об ошибке.
%if (&num) %then %do;
proc datasets lib=WORK nolist;
modify INST_CHAR8;
rename &rename;
run;
quit;
%end;
Если вы собираетесь использовать опцию RENAME = dataset, тогда пустой список подойдет.
data new;
set INST_CHAR8(rename=(&rename));
run;
Если конечной целью является загрузка в Tableau, то вы можете просто записать файл CSV. Файл CSV не имеет места для хранения информации о типах данных, но Tableau в целом игнорирует фактические типы данных полей и пытается классифицировать поля на основе значений, которые он видит.
proc export data=inst_char8 file='inst_char8.csv' replace dbms=csv label;
run;