SAS将所有数字更改为长度8,即使输入数据集定义了其他数字

  • 本文关键字:数字 数据集 定义 其他 SAS sas
  • 更新时间 :
  • 英文 :


我有两个需要交织的输入数据集。输入文件根据整数的大小为数字字段定义了长度。当我将数据集(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

最新更新