我有两个需要交织的输入数据集。输入文件根据整数的大小为数字字段定义了长度。当我将数据集(DATA或PROC SQL语句(交织在一起时,数字字段的长度都会重置为默认值8。除了在length语句中明确定义每个字段的长度外,SAS是否可以选择保留输入列的原始属性?
更多详细信息。。。
数据A;
长度numeric_variable 3;
{输入数据};
数据B;
长度numeric_variable 3;
{输入数据};
数据AB;
集合A B;通过some_id_variable;
{stuff};
在数据集AB中,变量NUMERIC_variable的长度为8,而不是3。我可以在"dataAB"语句中显式地放入另一个长度语句,但我有很多列。
您的描述是错误的。数据步骤将根据最初定义的方式设置长度。如果您只是在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代码,您需要在SELECT子句中包含LENGTH=选项,以强制创建变量的长度。
您能发布演示该问题的代码吗?
此代码没有显示数值长度从3变为8的最终数据集。
data A; id = 'A'; length x 3; x=1;
data B; id = 'A'; length x 3; x=2;
data AB;
set A B;
by id;
run;
proc contents data=AB; run;
内容
# Variable Type Len
1 id Char 1
2 x Num 3