我尝试使用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调用来创建带引号的字符串,但这也不起作用。
发布于 2013-06-27 03:42:45
也许我漏掉了什么,但"&viewname"不会做这件事吗?
发布于 2013-06-27 03:34:24
我发现使用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;这实现了你所希望的吗?
发布于 2013-06-28 05:25:52
鲍勃,这不管用,因为管用。%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;当然,正如前面所说的,没有人真的擅长宏观引用:-)
https://stackoverflow.com/questions/17328518
复制相似问题