我的目的很简单。只想为数据集提供一些值。有两个步骤。首先,将值读入宏变量。其次,将宏变量传递给数据集。代码是:
首先,创建宏变量。
proc sql;
select procdate, prim,side,orgnname,orgnid,OrgnStTe into :procdate, :prim, :side, :orgnname, :orgnid, :OrgnStTe from ours
where objid=783125;
quit;
此步骤效果很好。然后传递值。
data test;
set m1;
if id=184 then DO;
objid=783125;procdate=&procdate.;prim=&prim.;side=&side.;orgnname=&orgnname.;orgnid=&orgnid.;OrgnStTe=&OrgnStTe.;
END;
run;
对于此步骤,错误与orgnname有关。对错误不太确定。我尝试了%bquote(& orgnname。)和%str(& orgnname。)。两者都不起作用。
注意:由宏变量" ORGNNAME"生成的行。 1 CALVARY JOHN JAMES MEMORIAL HOSPITAL ---- 388 76 错误388-185:期待算术运算符。
ERROR 76-322:语法错误,语句将被忽略。
答案 0 :(得分:2)
展开宏变量时,生成的代码需要是有效的SAS语法。在您想要引用字符串文字的情况下,该值必须在引号中。
ORGNNAME = "1 CALVARY JOHN JAMES MEMORIAL HOSPITAL";
为了用宏变量做到这一点,语法如下:
ORGNNAME = "&ORGNAME";
但实际上,使用宏变量来传输已经在数据集中的值是没有意义的。它需要太多工作,容易出错或价值截断。为什么不直接从数据集中读取数据呢?
data test;
set m1;
if id=184 then DO;
set ours (where=(objid=783125) keep=objid procdate prim side orgnname orgnid OrgnStTe);
end;
run;