SAS的宏变量引用错误

时间:2013-06-26 19:10:21

标签: sas sas-macro

我试图使用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调用来创建带引号的字符串,但这也不起作用。

3 个答案:

答案 0 :(得分:3)

也许我错过了什么,但不会"&viewname"做这个工作?

答案 1 :(得分:1)

我发现使用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;

这会实现你所希望的吗?

答案 2 :(得分:1)

鲍勃,它不起作用,因为它有效。 %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;

当然,正如已经说过的那样,没有人在宏引用方面表现得非常好: - )