2014-07-01 4 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; 

Если этот макрос вар не будет решена или не создана (ни одна строка не выбрана из набора данных), я хотел бы пропустить. Когда я,

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

SAS выдает ошибку с сообщением «MACRO имя переменной 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

я забыл заменить X с num_tables, просто хотел, чтобы сделать его универсальным. Кроме того, я я не использовал & перед num_tables.Так что мой код был% if% symexist (num_tables)% then% do; – rom

+0

Это не согласуется с той ошибкой, которую вы даете, хотя '% if% symexist (num_tables)' является юридическим синтаксисом в любом сеансе SAS. Ничто из того, что вы делаете в «подходах», имеет смысл с этим - все они изменяют содержимое num_tables, а не само имя. – Joe

ответ

0

Вероятно, вы предидируете num_tables в symexist с помощью &. Это правильный способ реализовать% SYMEXIST в том виде, который вы задаете. Обратите внимание, что аргумент% symexist не равен &num_Tables, но 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^