2013-06-26 88 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; 

當然,前面已經說了,沒有人真的很好在宏報價中:-)