如何接收和过滤来自报告的存储过程的数组数据是SAS

时间:2017-12-19 05:16:32

标签: sas sas-macro

我有一个名为_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

我不知道出了什么问题,我错过了任何更好的方法。

1 个答案:

答案 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,但在这种情况下,您的其他宏应该已经跳过调用,因此它不应该重要。