SAS宏引用如何与格式文字交互?

时间:2011-06-21 12:29:55

标签: sas proc-sql

在干净的会话中执行本地:

%let x = %str(put(age, best.));

proc sql;
    select &x from sashelp.class;
quit;

这会产生以下错误:

1     put(age, best.)
               ----
               22
                ----
                76
ERROR 22-322: Syntax error, expecting one of the following: a format name, ?.

ERROR 76-322: Syntax error, statement will be ignored.

但是这个“手动解析”版本在没有注释,警告或错误的情况下运行:

proc sql;
    select put(age, best.) from sashelp.class;
quit;

有人可以确切地解释%str()在这个程序中做了什么导致执行时出现问题?对模糊问题道歉,但我不确定相关的互动是什么;我无法使用等效的数据步骤语法进行复制,因此可能涉及proc SQL的特性?

5 个答案:

答案 0 :(得分:3)

%str()函数在宏编译期间屏蔽字符串。删除let语句中的%str()函数,或者在sql select中添加%unquote()函数,以便在正确解析时使用。

答案 1 :(得分:2)

this question on runsubmit.com回答:

  

我打算将这个答案标记为   是的,因为它引导我到这个页面   文件:   http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#tw3514-unquote.htm    - “在极少数情况下,使用宏引用功能屏蔽文本会改变方式   扫描仪一词标记文本   ...扫描仪一词不使用它   作为文字标记的边界   输入堆栈。“听起来像个bug,   坦白说,但如果令牌化器   算法像我一样古老而多毛   想象一下,我也把它作为一个怪癖!

答案 2 :(得分:1)

您可以使用格式声明吗?例如,这很好用。

%let x = %str( age format=best.);

proc sql;
    select &x. from sashelp.class;
quit;

答案 3 :(得分:1)

出于某种原因,SAS不喜欢“最好的”。格式。

即。当我尝试这个时,你的代码可以运行

 %let x = %str(put(age, 8.));

????

答案 4 :(得分:0)

如果将其添加到代码中

%put _user_ ;

您将在日志中看到%str引用& x的方式。这就是proc sql代码不起作用的原因。在proc sql语句的select部分使用%Unquote将允许代码运行。

http://www2.sas.com/proceedings/forum2007/152-2007.pdf