如何接收和过滤来自报告的存储过程的数组数据是SAS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何接收和过滤来自报告的存储过程的数组数据是SAS相关的知识,希望对你有一定的参考价值。
我有一个名为_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
我不知道什么是错的,我错过了任何更好的方法。
答案
你的代码应该有效。 %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,但在这种情况下,您的其他宏应该已经跳过调用,因此它无关紧要。
以上是关于如何接收和过滤来自报告的存储过程的数组数据是SAS的主要内容,如果未能解决你的问题,请参考以下文章