如何接收和过滤从报表发送到存储进程的阵列数据是SAS的一部分

如何接收和过滤从报表发送到存储进程的阵列数据是SAS的一部分,sas,sas-macro,Sas,Sas Macro,我有一个名为的参数,它从列表中接受多个值,并将它们发送到我的存储进程,假设我在其中发送了四个值(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 I

我有一个名为的参数,它从列表中接受多个值,并将它们发送到我的存储进程,假设我在其中发送了四个值
(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

我不知道怎么了,我错过了更好的方法

您的代码应该可以工作。%IDS宏可能更简洁,并且可能需要更多的逻辑来处理计数小于2时宏变量创建方式的不一致性。因此,在尝试循环0和1变量之前,此宏将确保填充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,但是,在这种情况下,您的另一个宏应该已经跳过调用,所以这不重要。

您确定ID变量是数字吗?在我的报告中,它是character/string。在我的日志文件中没有错误,但在webout文件中也看不到任何筛选数据。如果尝试使用
in
操作符中的值不正确,则会出现错误与要比较的变量类型不匹配。启用MPRINT选项可在日志中查看生成的代码。在第二个宏的
&count
%if
中输入引号的目的是什么?如果用户没有选择任何值,则该部分将不会运行。我只是不知道如何用数组数据更新数据集。如果用户没有选择任何值,则过滤器将不会执行。您的代码绝对可以正常工作,但如果用户发送数据为10、5、8、2、3等,该怎么办?
%filter
将运行,但如果
和_id0=0
则您将
计数设置为
“0”
因此它不会调用
PROC SQL
%id
。但是,既然您已经将宏%IDS创建为一个独立的实用程序宏,那么当调用它时,您希望它生成什么?我以为您是在使用提示符让用户从数据中的实际值中进行选择。他们如何将多个值放入同一个宏变量中?如果用户选择值10,5,8,2和3,则_ID0将为5,%id将生成
10 5 8 2 3
。请注意,SAS在in()运算符的值列表中不需要逗号。是的,我已经创建了一个数据集。如果用户选择任何值,则过滤器将运行并根据这些值更新数据集,否则它将把数据集的所有值打印到webout。在sas管理控制台-->文件夹中,我创建了一个接收多个值的存储进程,其名称为_ID。它发送多个值,如_ID1、_ID2等,我想根据这些值更新数据集