我有这些数据,我想使用宏更新某个表
DATA WORK.t1; LENGTH POLICY_RK 8 POLICY_VERSION 8 TREATMENT_IND 8 ; FORMAT POLICY_RK BEST12. POLICY_VERSION BEST12. TREATMENT_IND BEST12. ; INFORMAT POLICY_RK BEST12. POLICY_VERSION BEST12. TREATMENT_IND BEST12. ; INFILE DATALINES4 DLM='7F'x MISSOVER DSD ; INPUT POLICY_RK : BEST32. POLICY_VERSION : BEST32. TREATMENT_IND : BEST32. ; DATALINES4; 105000002 114000005 123000007 132000001 141000007 1508 ;;;;
我正在尝试运行以下代码:
%macro storno (pol_rk , pol_ver ); PROC SQL; UPDATE t1 SET POLICY_VERSION=POLICY_VERSION*3.1113 where POLICY_RK=&pol_rk and policy_Version = &pol_ver; QUIT; %mend ; data _null_; set t1 ; IF input(TREATMENT_IND,best12.) eq 1 THEN do; call symputx("a",policy_rk); call symputx("b",pol_ver); end; %storno(&a, &b); %put a=&a; %put b=&b; run;
但收到一条警告信息:
警告:未解析显式符号引用A. 警告:未解析表观符号引用B. 注意:数字值已在以下位置转换为字符值:(行):(列).19:21
注意:从数据集WORK.T1中读取了6个观察值.注意:使用的DATA语句(总处理时间):实时0.00秒cpu时间0.00秒
注意:WORK.T1中没有更新任何行.
这到底我到底做错了什么......?
CALL SYMPUTX
将值分配给宏变量,但这些宏变量在分配它们的DATA步骤结束之后才可用.
那是因为宏语言在数据步骤结果之前编译.所以SAS %storno(&a, &b)
在处理DATA步骤之前看到你的调用,以分配宏变量&a
和&b
.
有关详细信息,请参阅此链接的"试图引用的问题..."小节:https://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a000210266.htm
这就是为什么你看到关于符号引用未被解决的警告 - 当你试图使用它们时它们还不存在.