【问题标题】:SAS type issue using a macro function使用宏函数的 SAS 类型问题
【发布时间】:2021-06-02 14:09:00
【问题描述】:

我有一个宏函数定义如下。

%macro sqlloop(event_id, empl_nbr_var, fleet, base, position);
...lots of code...
%mend;

实际代码将基于更大的表进行引用,但为了排除故障和简单起见,我提供了该表第一行的缩短版本,row1

event_id empl_nbr_var fleet base position
1234 111 320 CHS A

在输出数据中检查所有类型的字符,除了 event_id,它是数字。这正是我想要的程序。当我手动输入时,它可以完美运行。

%sqlloop(1234, '111', '320', 'CHS', 'A');

但是下面的代码抛出了各种各样的错误,我认为是类型问题。

data _null_;
    set Work.row1;
    call execute('%sqlloop(17,'||strip(empl_nbr_var)||','||strip(fleet)||','||strip(base)||','||strip(position)||');');
run;

暂时忽略第 17 部分,假设那是正确的

我得到的第一个错误如下,所有其他错误似乎都源于该表未创建。

ERROR: The following columns were not found in the contributing tables: A, CHS.

请注意,A 或 CHS 周围没有引号,我认为应该有引号?对 SAS 来说还是新手,所以不是很熟悉,但对我来说,这似乎是错误。这是 strip() 的奇怪之处,还是我完全缺少的其他东西?

【问题讨论】:

  • 开启OPTIONS MPRINT 并显示宏正在执行的代码。您可能需要在宏内将baseposition 的分辨率加双引号(即"&base""&position",以便代码生成将参数用作字符串值。
  • 就是这样。谢谢!!
  • 您的手动调用是在参数值中添加单引号。 CALL EXECUTE() 代码没有添加那些引号字符。如果您需要传递给宏的值中的引号,只需将 STRIP() 函数调用替换为 QUOTE(TRIM()) 函数即可。

标签: types sas sas-macro


【解决方案1】:

对于宏处理器来说,一切都是文本。因此,在您的手动调用中,您在宏参数的值中包含了引号。而在 CALL EXECUTE() 语句中你没有。

您可以重新编写宏以不需要值中的引号。例如,将 &fleet. 之类的引用替换为 "&fleet."

或者在生成宏调用的时候加上引号。

data _null_;
  set work.row1;
  call execute(cats('%sqlloop(17,',quote(trim((empl_nbr_var))
                   ,',',quote(trim(fleet))
                   ,',',quote(trim(base))
                   ,',',quote(trim(position))
                   ,');'
  ));
run;

【讨论】:

  • 我和catx 有点相似。是的,SAS 报价处理的可爱、高学习曲线!
  • 如果您使用 PUT 语句生成对文本文件的宏调用,那么您可以使用 $QUOTE 格式添加引号。 put ',' empl_nbr_var :$quote. ...
  • @Tom 你应该添加 %NRSTR(%sqlloop( ?
  • 是的。如果宏很复杂,使用 %nrstr() 将其执行延迟到数据步骤之后至关重要。 call execute(cats('%nrstr(%sqlloop)(17,'...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多