Ваше описание неверно. Шаг данных устанавливает длину в зависимости от того, как она была определена вначале. Если вы просто выберете переменную в SQL, она сохранит свою длину. Однако в SQL, если вы делаете что-то вроде UNION, который объединяет переменные из разных источников, тогда длина будет равна 8.
Пример:
data one; length x 3; x=1; run;
data two; length x 5; x=2; run;
data one_two; set one two; run;
data two_one; set two one; run;
proc sql ;
create table sql_one as select * from one;
create table sql_two as select * from two;
create table sql_one_two as select * from one union select * from two;
create table sql_two_one as select * from two union select * from one;
quit;
proc sql;
select memname,name,length
from dictionary.columns
where libname='WORK'
and memname like '%ONE%'
or memname like '%TWO%'
;
quit;
Результаты:
Column
Member Name Column Name Length
----------------------------------------------------------------------------
ONE x 3
ONE_TWO x 3
SQL_ONE x 3
SQL_ONE_TWO x 8
SQL_TWO x 5
SQL_TWO_ONE x 8
TWO x 5
TWO_ONE x 5
Итак, если вы хотите определить свои переменные, либо добавьте оператор длины, как вы упомянули, либо создайте наборы данных шаблона и сделайте ссылку на него в своих шагах данных, прежде чем ссылаться на другие наборы данных. Для сложного кода SQL вам нужно будет включить параметр LENGTH = в предложение SELECT, чтобы задать длины для создаваемых вами переменных.