SAS:如果存在,请保留

SAS:如果存在,请保留,sas,selection,Sas,Selection,我有几个数据库,每个地理变量一个,我想在最后附加这些数据库。我正在对它们执行一些数据步骤。因为我有大型数据库,所以当我第一次调用每个表时,我只选择需要的变量。但在一个变量始终等于0的表上,该变量不在表中 因此,当我在for循环中选择my(keep=var)时,如果变量存在,它可以正常工作,但在另一种情况下会产生错误,因此这些表被忽略 %do i=1 to 10 ; data temp; set area_i(keep= var1 var2); run; proc append ba

我有几个数据库,每个地理变量一个,我想在最后附加这些数据库。我正在对它们执行一些数据步骤。因为我有大型数据库,所以当我第一次调用每个表时,我只选择需要的变量。但在一个变量始终等于0的表上,该变量不在表中

因此,当我在for循环中选择my(keep=var)时,如果变量存在,它可以正常工作,但在另一种情况下会产生错误,因此这些表被忽略

%do i=1 to 10 ; 

data temp;
    set area_i(keep= var1 var2);
run;

proc append base=want data=temp force; 
run;

%end;

有没有简单的方法来解决这个问题

如果它还不存在,就把它添加到表中怎么样

/*look at dictionary.columns to see if the column already exists*/
proc sql;
    select name into :flag separated by ' ' from dictionary.columns where libname = 'WORK' and memname = 'AREA_I' and name = 'VAR1';
run;

/*if it doesn't, then created it as empty*/
%if &flag. ne VAR1 %then %do;
    data area_i;
        set area_i;
        call missing(var1);
    run;    
%end;

事实上,我已经找到了一个解决方案:DKRICOND(或DKROCOND)选项指定在处理DROP=、KEEP=、或RENAME=数据集选项期间,当输入(或输出)数据集中分别缺少变量时,要报告的错误检测级别

选项为DKRICOND=ERROR | WARN | WARNING | NOWARN | NOWARNING,因此您只需挥手即可进行设置

dkricond=warn

/*your program, in my case :*/
%do i=1 to 10 ; 
data temp;
    set area_i(keep= var1 var2);
run;
proc append base=want data=temp force; 
run;
%end;

dkricond=error /* the standard value, probably better to set it back after/ */

你能再解释一下你在做什么吗?就像旗子一样,如果它能工作,如果它在area1@AnthonyMartindictionary.columns包含有关所有数据集中所有列的信息。您可以查询它来判断给定数据集中是否存在
var1
正在做什么?我的程序中有一个宏循环,我在这里简化了它,它可能根本不起作用。但是我想你已经知道了,它应该在每个区域运行。