【问题标题】:Macro variable quoting error with SASSAS 的宏变量引用错误
【发布时间】:2013-06-26 19:10:20
【问题描述】:

我正在尝试使用 PROC SQL 和现有宏变量的值将一行插入 SAS 数据集中,但我收到标准语法错误消息。下面是一个失败的代码示例:

%let viewname=MKTVIEWS.imei_ref;
%let xrc=0;
%let xmsg= ;

proc sql;
   create table results (viewname char(40), xrc numeric, xmsg char(200));
   insert into results (viewname, xrc, xmsg)
   values ( %str(%')&viewname%str(%') 
          , &xrc 
          , %str(%')%superq(xmsg)%str(%') );
quit;

这是错误信息:

ERROR 22-322: Syntax error, expecting one of the following: a quoted string, 
a numeric constant, a datetime constant, a missing value, +, -, MISSING, NULL,
USER.

在没有两个字符宏变量的情况下运行程序可以正常工作:

proc sql;
   create table results (viewname char(40), xrc numeric, xmsg char(200));
   insert into results (viewname, xrc, xmsg)
   values ( 'MKTVIEWS.imei_ref'
          , &xrc 
          , '' );
quit;

很明显,我缺少有关宏引用或类似内容的内容。我什至尝试使用临时宏变量而不是嵌入那些 %STR 调用来创建带引号的字符串,但这也不起作用。

【问题讨论】:

  • 有时我注意到 SAS 会被宏引用函数的有效使用绊倒。发生这种情况时,将麻烦的代码包装在 %unquote() 中将允许解析器继续。

标签: sas sas-macro


【解决方案1】:

也许我遗漏了一些东西,但"&viewname" 不会做这项工作吗?

【讨论】:

  • 啊,是的。俯瞰显而易见的我。不过,我很好奇为什么它不像写的那样工作,但我现在并不在乎。非常感谢。
【解决方案2】:

我发现使用 datastep 引用函数最容易,主要是因为我不擅长真正的宏引用。

%let viewname=MKTVIEWS.imei_ref;
%let xrc=0;
%let xmsg= ;


options symbolgen mprint;
proc sql;
   create table results (viewname char(40), xrc numeric, xmsg char(200));
   insert into results (viewname, xrc, xmsg)
   values ( %sysfunc(quote(&viewname))
          , &xrc 
          , %sysfunc(quote(%superq(xmsg))) );
quit;

这是否实现了您的期望?

【讨论】:

  • 哈哈,乔别担心——我认为没有人真正擅长真正的宏引用。
  • Ian Whitlock 相当不错,但即使他在“A Serious Look Macro Quoting”的结论中也表示:“宏工具中的错误阻止了对宏引用工作方式的一致模式的识别。”并给出了为什么宏引用如此难以学习/理解的其他原因。他的论文可以在www2.sas.com/proceedings/sugi28/011-28.pdf找到
【解决方案3】:

鲍勃,它不起作用,因为它起作用了。 %STR 蒙面引号不仅来自宏编译器(如您所料),而且通常来自程序编译器。 因此,在您的 SQL 中,您为没有引号的字符变量提供了值。

看看这里的区别,除了%str之外没有宏的东西:

data text;
length text $50;
text=%str(%')bla bla text%str(%');
run;

data text;
length text $50;
text="%str(%')bla bla text%str(%')";
run;

如果您需要在表中引用字符串:

proc sql;
   create table results (viewname char(40), xrc numeric, xmsg char(200));
   insert into results (viewname, xrc, xmsg)
   values ( "%str(%')&viewname%str(%')"
          , &xrc 
          , "%str(%')%superq(xmsg)%str(%')" );
quit;

当然,如前所述,没有人真正擅长宏引用:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多