我试图使用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
调用来创建带引号的字符串,但这也不起作用。
答案 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
之外没有宏观内容:
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;
当然,正如已经说过的那样,没有人在宏引用方面表现得非常好: - )