我有一个名为_ID的参数,他从列表中接受多个值并将其发送到我的存储过程,让我说我我已经在其中发送了四个值(1,2,3,4)
,我将在我的商店流程中收到它们,
_ID0 = 4
_ID1 = 1
_ID2 = 2
_ID3 = 3
_ID4 = 4
_ID_COUNT = 4
我正在接收并过滤它们。
%let ID = "&_ID";
%let Count = "&_ID_COUNT";
%macro IDs;
%global _ID0;
/* If more than one ID value was selected then cycle through the values */
%if %eval(&_ID0 ge 2) %then %do;
%do i=1 %to &_ID0;
&&_ID&i
%end;
%end;
/* If only one ID value was selected */
%else &_ID
%mend;
****************************;
%macro filter;
%if &Count ne "0" %then %do;
%stpbegin;
proc sql noprint;
create table users as
select *
from work.users
where id in(%IDs);
run;
%stpend;
%end;
%mend; %filter;
日志中没有任何错误上面有一个是我的代码,但它没有过滤任何内容。如果用户表在id列中的值为1-10,则应仅使用1,2,3,4
更新用户user
id
1
2
3
4
5
6
7
8
9
10
过滤后我想要
user
id
1
2
3
4
我不知道出了什么问题,我错过了任何更好的方法。
答案 0 :(得分:1)
您的代码应该有效。 %IDS宏可能更简洁,并且可能需要更多逻辑来处理当count小于2时如何创建宏变量的不一致性。因此,此宏将确保填充0和1变量(至少在在尝试循环之前,宏正在运行。
%macro IDs;
%local i ;
%let _id0 = &_id_count ;
%if &_id0 = 1 %then %let _id1 = &_id ;
%if &_id0 = 0 %then -99999 ;
%do i=1 %to &_id0;
&&_ID&i
%end;
%mend IDs;
根据您的示例数据,它应该像这样工作:
1071 %put (%ids);
(1 2 3 4)
如果他们不选择任何值,您想要发出什么价值?我已将此示例设置为生成-9999,但在这种情况下,您的其他宏应该已经跳过调用,因此它不应该重要。