SAS中的宏变量引用错误

SAS中的宏变量引用错误,sas,sas-macro,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)

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

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

这是否实现了您的期望?

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

这能实现你的期望吗?

也许我遗漏了什么,但不会
“&viewname”
做这项工作?

也许我遗漏了什么,但不会
“&viewname”
做这项工作吗?

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

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

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

当然,正如前面所说,没有人真的擅长宏观引用:-)

啊,是的。忽略了显而易见的我。尽管如此,我还是很好奇为什么它不能像写的那样工作,但在这一点上我并不在乎。非常感谢。嗯,是的。忽略了显而易见的我。尽管如此,我还是很好奇为什么它不能像写的那样工作,但在这一点上我并不在乎。非常感谢。哈哈,别担心,乔-我认为没有人真的擅长真正的宏引用。伊恩·惠特洛克(Ian Whitlock)相当不错,但他甚至在“严肃的宏引用”的结论中指出:“宏设施中的缺陷妨碍了对宏引用工作方式的一致模式的认识。”并给出了宏引用很难学习/理解的其他原因。他的论文可以在《哈哈,别担心,乔》——我认为没有人真正擅长于真正的宏观引用。伊恩·惠特洛克(Ian Whitlock)相当不错,但即使是他在“严肃的宏观引用”的结论中也指出:“宏观设施中的缺陷妨碍了对宏观引用工作方式的一致模式的认识。”并给出了宏引用很难学习/理解的其他原因。他的论文可以在网站上找到,有时我注意到SAS被有效使用宏引用函数绊倒了。发生这种情况时,将麻烦的代码包装在
%unquote()
中将允许解析器继续。有时我注意到SAS会因有效使用宏引用函数而出错。发生这种情况时,将麻烦代码包装在
%unquote()
中将允许解析器继续。