如何接收和过滤从报表发送到存储进程的阵列数据是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等,我想根据这些值更新数据集