首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS的宏变量引用错误

SAS的宏变量引用错误
EN

Stack Overflow用户
提问于 2013-06-27 03:10:21
回答 3查看 3.9K关注 0票数 1

我尝试使用PROC SQL和现有宏变量的值将一行插入到SAS数据集中,但得到了标准语法错误消息。下面是一个失败的代码示例:

代码语言:javascript
复制
%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;

以下是错误消息:

代码语言:javascript
复制
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.

在不使用两个字符的宏变量的情况下运行程序运行正常:

代码语言:javascript
复制
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调用来创建带引号的字符串,但这也不起作用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-27 03:42:45

也许我漏掉了什么,但"&viewname"不会做这件事吗?

票数 3
EN

Stack Overflow用户

发布于 2013-06-27 03:34:24

我发现使用datastep引用函数是最简单的,很大程度上是因为我不擅长真正的宏引用。

代码语言:javascript
复制
%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;

这实现了你所希望的吗?

票数 1
EN

Stack Overflow用户

发布于 2013-06-28 05:25:52

鲍勃,这不管用,因为管用。%STR屏蔽的引号不仅来自宏编译器(正如您所期望的),而且还来自程序编译器。因此,在SQL中,您为没有引号的字符变量提供了值。

看到这里的区别了,除了%str,没有宏的东西

代码语言:javascript
复制
data text;
length text $50;
text=%str(%')bla bla text%str(%');
run;

data text;
length text $50;
text="%str(%')bla bla text%str(%')";
run;

如果您需要在表中使用带引号的字符串:

代码语言:javascript
复制
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;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17328518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档