2013-06-26 72 views
1

我想使用PROC SQL和现有的宏变量的值插入到SAS数据集的行,但我收到标准的语法错误消息。这里是一个失败的代码示例:与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; 

显然我错过了一些关于宏观引用或类似的东西。我甚至尝试过使用临时宏变量,而不是嵌入这些调用来创建引用字符串,但那也不起作用。

+0

有时候我注意到SAS被有效使用宏引用函数绊倒了。发生这种情况时,在'%unquote()'中包装麻烦的代码将允许解析器继续。 –

回答

3

也许我错过了一些东西,但不会"&viewname"做这份工作?

+0

找到,是的。俯视着显而易见的我。不过,我很好奇它为什么不能像书面形式那样工作,但我并不在乎这一点。非常感谢。 – BellevueBob

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; 

这是否实现了你所希望的?

+0

哈哈不要担心乔 - 我不认为有任何人在真正的宏观引用中真的很好。 –

+0

Ian Whitlock是相当不错的,但他甚至在“宏观看待宏观引用”的结论中表示:“宏观设施中的错误阻止了对宏观引用如何工作的一致模式的认识。”并给出了宏观引用如此难以学习/理解的其他原因。他的论文可以在http://www2.sas.com/proceedings/sugi28/011-28.pdf –

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; 

当然,前面已经说了,没有人真的很好在宏报价中:-)