3

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

%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 特性?

4

5 回答 5

3

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

于 2011-06-21T12:56:46.903 回答
2

在 runsubmit.com 上回答了这个问题:

我要将此答案标记为正确,因为它引导我访问此文档页面:http: //support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#tw3514- unquote.htm - “在极少数情况下,使用宏引用函数屏蔽文本会改变文字扫描仪标记文本的方式......文字扫描仪不会将其用作输入堆栈中文字标记的边界”。坦率地说,听起来像一个错误,但如果分词器算法像我想象的那样古老而多毛,我也会把它当作一个怪癖来旋转!

于 2011-06-22T19:50:25.407 回答
1

您可以使用格式语句代替吗?例如,这工作得很好。

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

proc sql;
    select &x. from sashelp.class;
quit;
于 2011-06-21T12:59:51.077 回答
1

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

即当我尝试这个时,你的代码有效

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

???

于 2011-06-21T15:03:32.107 回答
0

如果您将此添加到您的代码中

%put _user_ ;

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

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

于 2011-07-19T23:41:48.253 回答