2014-07-01 75 views
0

我正在使用%SYMEXIST來檢查宏變量是否存在,然後根據結果繼續或跳過。這聽起來很簡單,但SAS迄今爲止嘗試的所有方法都出現錯誤。使用%SYMEXIST時導致空格錯誤

& num_tables是根據特定條件從數據集創建的宏。

proc sql noprint; 
select distinct data_name into :num_tables separated by ' ' 
from TP_data 
where trim(upcase(Data_Name)) in 
    (select distinct(trim(upcase(Data_Name))) from Check_table 
    where COALESCE(Num_Attri_DR,0)-COALESCE(Num_Attri_Data,0) = 0 
    and Name_Missing_Column eq ' ' and Var_Name eq ' '); 
quit; 

如果這個宏var沒有解析或沒有創建(沒有從數據集中選擇行),我想跳過。當我用,

%if %symexist(num_tables) %then %do; 

SAS給出錯誤消息「宏變量名X必須以字母開頭或下劃線」。所以我嘗試使用以下所有方法刪除前導空格:

%let num_tables = &num_tables; /* approach 1 */ 
%let num_tables = %sysfunc(trim(&num_tables)) /* approach 2 */ 
%let num_tables = %trim(&num_tables) /* approach 3 */ 

但是這些都沒有奏效。我仍然收到錯誤「MACRO變量名稱X必須以字母或下劃線開頭」

+0

哪裏「X」從何而來「?你實際做'如果%% symexist(num_tables)'也許? – Joe

+0

我忘了替換num_tables的X,只是想使其通用性。另外,我我的代碼是%if%symexist(num_tables)%then%do; – rom

+0

這與您提供的錯誤不一致;'%if%symexist(num_tables)'是合法的語法在任何SAS會話中,您在'方法'中所做的任何事情都沒有意義 - 它們都修改num_tables的內容,而不是名稱本身。 – Joe

回答

0

可能您正在使用&在symexist中爲num_tables做好準備。這是以您所要求的方式實現%SYMEXIST的正確方法。請注意,%symexist的參數不是&num_Tables,而是num_tables(宏變量的實際名稱)。如果您將其與&一起使用,它將解析爲其任何內容。

%macro testshort(char=); 
proc sql noprint; 
select distinct name into :num_tables separated by ' ' 
from sashelp.class 
where substr(name,1,1)="&char."; 
quit; 
%if %symexist(num_tables) %then %do; 
%put Tables: &num_tables; 
%end; 
%mend testshort; 

%testshort(char=A); 
%testshort(char=B); 
%testshort(char=Z);