在干净的会话中执行本地:
%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的特性?
答案 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将允许代码运行。