【问题标题】:Macro variable can't be read correctly无法正确读取宏变量
【发布时间】:2017-03-20 06:32:43
【问题描述】:

我的目的很简单。只想给数据集一些值。有2个步骤。首先,将值读入宏变量。其次,将宏变量传递给数据集。代码是:

首先,创建宏变量。

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 加略·约翰·詹姆斯纪念医院 ---- 388 76 错误 388-185:需要算术运算符。

ERROR 76-322:语法错误,语句将被忽略。

【问题讨论】:

    标签: macros sas


    【解决方案1】:

    当您展开宏变量时,生成的代码需要是有效的 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;
    

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 2021-12-09
      • 2018-10-07
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多