Sas 如果条件为true,则执行宏

Sas 如果条件为true,则执行宏,sas,Sas,我有一个宏,我只想在某个表不为空时执行 否则,宏将引发异常 我试着在宏中找到类似的东西, 在行动开始之前: %if &some_variable >= 0 %then %do; %put TABLE IS NOT EMPTY; %macro_name(var1= &var1,var2 = &var2); %end; %else %put TABLE IS EMPTY!; 它似乎不起作用 我错过了什么 有更好的解决办法吗 谢谢 编辑 下面是我的代码。 我想做的是

我有一个宏,我只想在某个表不为空时执行 否则,宏将引发异常

我试着在宏中找到类似的东西, 在行动开始之前:

%if &some_variable >= 0 %then %do;
%put TABLE IS NOT EMPTY;
%macro_name(var1= &var1,var2 = &var2);
%end;

%else  %put TABLE IS EMPTY!;
它似乎不起作用

我错过了什么

有更好的解决办法吗

谢谢

编辑 下面是我的代码。 我想做的是, 当变量MIN_X___SERIAL_NO为null时,表示表为空-我不希望宏运行。 就这么简单

proc sql;
select min(X_INSURER_SERIAL_NO), 
max(X_INSURER_SERIAL_NO)-min(X_INSURER_SERIAL_NO)+1   
into: MIN_X_INSURER_SERIAL_NO,  :diff
from STG.FICTIVE_PREMID_AV_POL;
quit;



proc sql;
create table  STG.FICTIVE_PREMID_AV_POLICIES like STG.FICTIVE_PREMID_REGULAR_POLICIES;quit;



%macro fictive_premid_AV (MIN_X_INSURER_SERIAL_NO = , diff = );



%do i = &MIN_X_INSURER_SERIAL_NO %to &diff;
%put value of i:  &i;
proc sql;
select 
distinct mIN_X_POLICY_VERSION, max_X_POLICY_VERSION   into:     mIN_X_POLICY_VERSION_av,  :max_X_POLICY_VERSION_av
from STG.FICTIVE_PREMID_AV_POL where x_insurer_serial_no = &i;
quit;



proc sql;
insert into STG.FICTIVE_PREMID_AV_POLICIES
select  X_POLICY_NO,  X_INSURANCE_PRODUCT_CD,   OTHER_AGR_ID ,X_POLICY_VERSION, max_X_POLICY_VERSION,  0     as     FICTIVE_IND, x_insurer_serial_no,
x_product_section_agr_cd,
x_section_cd,
x_product_section_cd
from STG.FICTIVE_PREMID_AV_POL
where X_INSURER_SERIAL_NO = &i
and   X_POLICY_VERSION  =  min_X_POLICY_VERSION ;
quit;

%do  j =  &mIN_X_POLICY_VERSION_av %to %eval(&max_X_POLICY_VERSION_av-1) ;


%put value of j:  &j;
proc sql;
create table fictive_premid_t as
select * from 
(
select X_POLICY_NO,  X_INSURANCE_PRODUCT_CD,   %eval(&j+1)   as X_POLICY_VERSION, OTHER_AGR_ID,     max_X_POLICY_VERSION,  1 as FICTIVE_IND, x_insurer_serial_no,
x_product_section_agr_cd,
x_section_cd,
x_product_section_cd
from STG.FICTIVE_PREMID_AV_POLICIES
where  X_POLICY_VERSION = &j 
and x_insurer_serial_no = &i

except
select X_POLICY_NO,  X_INSURANCE_PRODUCT_CD, %eval(&j+1)   as X_POLICY_VERSION, OTHER_AGR_ID,     max_X_POLICY_VERSION,  1 as FICTIVE_IND, x_insurer_serial_no,
x_product_section_agr_cd,
x_section_cd,
x_product_section_cd
from STG.FICTIVE_PREMID_AV_POL
where X_POLICY_VERSION   =  %eval(&j+1) 
and x_insurer_serial_no = &i

)
union 
select X_POLICY_NO,  X_INSURANCE_PRODUCT_CD,%eval(&j+1)   as X_POLICY_VERSION, OTHER_AGR_ID,     max_X_POLICY_VERSION,  0 as FICTIVE_IND, x_insurer_serial_no,
x_product_section_agr_cd,
x_section_cd,
x_product_section_cd
from STG.FICTIVE_PREMID_AV_POL
where X_POLICY_VERSION   =  %eval(&j+1) 
and x_insurer_serial_no = &i;



insert into STG.FICTIVE_PREMID_AV_POLICIES
select X_POLICY_NO,  X_INSURANCE_PRODUCT_CD,  OTHER_AGR_ID ,X_POLICY_VERSION, max_X_POLICY_VERSION,     FICTIVE_IND, x_insurer_serial_no,
x_product_section_agr_cd,
x_section_cd,
x_product_section_cd
from fictive_premid_t
where X_POLICY_VERSION<= max_X_POLICY_VERSION;
quit;

%end;

%end;

   %mend;



%fictive_premid_av (MIN_X_INSURER_SERIAL_NO = &MIN_X_INSURER_SERIAL_NO, diff = &diff );

您的第一行,然后和也需要百分号:

%if &some_variable >= 0 %then %do;
请注意,只能在宏中使用%if%then语句,而不能在开放代码中使用。
另外,我假设某个_变量表示行数?不管表是否为空,您都希望以这种方式传递。在这种情况下,您可能希望>0而不是>=0。

您只需要将条件放在宏内部而不是外部。像这样:

%macro fictive_premid_AV (MIN_X_INSURER_SERIAL_NO = , diff = );

   %if &MIN_X_INSURER_SERIAL_NO >= 0 %then %do;

      <do your macro>

   %end;

  %else %put TABLE IS EMPTY;

%mend fictive_premid_av;

%fictive_premid_av (MIN_X_INSURER_SERIAL_NO = &MIN_X_INSURER_SERIAL_NO, diff = &diff );

当然非常感谢。我只是打错了。仍然-不起作用。您的代码提取是在宏中编写的吗?如果不是,那可能就是问题所在。如果没有,你能提到你收到的错误吗?谢谢你的回复。我稍微编辑了一下我的帖子。希望现在更清楚了。