如何删除SAS LOG中的Warning信息



当我在表中插入一条记录时,下面的警告消息正在写入SAS LOG

"警告:当分配给字符列inputjob">

时字符表达式将被截断如何停止将此消息写入SAS lOG,使我的作业返回码将为0而不是4

%MACRO INSDRY(inpdsn);
data _NULL_;
set DB2TS;
length jobname $8 jobid $8;
tiotptr = peek(peek(540)+12);
jobname = peekc(tiotptr,8);
jscbptr = peek(peek(540)+180);
ssibptr = peek(jscbptr+316);
jobid = peekc(ssibptr+15,5);
inputjob = jobname || ' ' || "JOB" || jobid;
call symputx('inputjob',inputjob);
run;
proc sql;
insert into table
(filename, inputjob)
values
(%sysfunc(quote(&inpdsn)),%sysfunc(quote(&inputjob)));
quit;
%MEND;
do i=1 to f_count;
set ftp_dir_list point=i nobs=f_count;
if prxmatch(iPat_RE, trim(dir_file)) > 0 then do;
iFTP_DSN = dir_file;
CALL EXECUTE (cats('%INSDRY(',trim(iFTP_DSN),');'));
incount+1;
found+1;
end;
end;

获取定义为17位的input_job列的警告消息,其值i get也是17位。

当我删除宏时没有得到这个警告。

我没有看到任何DATA步骤。我看到了一个宏定义(这应该是代码中的第一件事,因为它只是一个定义,而不是实际的执行)。

如果您通过CALL EXECUTE()调用宏,请确保至少用%NRSTR()宏函数包围%INSDRY,以防止SAS在执行CALL EXECUTE语句时执行宏。这将把宏生成的SAS语句推到一个堆栈上,以便在数据步骤结束后执行。相反,您希望将宏调用本身添加到堆栈中,以便在数据步骤结束后执行。

如果宏引用的宏变量的值由宏生成的SAS代码更改,则尤其如此。在您的示例中,是CALL SYMPUTX()语句。因此,当宏尝试使用宏变量生成代码时,它的值尚未设置,因为将设置其值的语句仍在等待运行。

程序流程应该是这样的:

%MACRO INSDRY(inpdsn);
... body of the macro definition here ...
%MEND;
data _null_;
set ftp_dir_list ; 
if prxmatch(iPat_RE, trim(dir_file)) then do;
iFTP_DSN = dir_file;
CALL EXECUTE(cats('%nrstr(%INSDRY)(',iFTP_DSN,')'));
incount+1;
found+1;
end;
end;

JobNameJobId都是$8,所以连接赋值语句

inputjob = jobname || ' ' || "JOB" || jobid;

将隐式创建长度为$20的变量inputjob

"JOB"从连接中删除,您将位于$17

很多时候,最好在步骤开始时编写lengthattrib语句,以确保在PDV中显式地定义变量。

最新更新