我的目标是创建一个SAS存储过程,用于返回单个数据集的数据并根据传入的多值输入参数过滤该数据集中的列存储过程。获取SAS存储过程中通过动态列表过滤的数据
有没有简单的方法来做到这一点?
有没有办法做到这一点?
这是我到目前为止。我正在使用宏来动态生成KEEP
语句来定义要返回的列。我在顶部定义了宏变量,以模拟通过SAS BI Web服务调用时传递到存储过程的内容,因此不幸的是,这些变量必须保持原样。这就是为什么我试图使用VVALUEX
方法将列名称字符串转换为变量名称。
注意 - 我是新来的SAS
libname fetchlib meta library="lib01" metaserver="123.12.123.123"
password="password" port=1234
repname="myRepo" user="myUserName";
/* This data represents input parameters to stored process and
* is removed in the actual stored process*/
%let inccol0=3;
%let inccol='STREET';
%let inccol1='STREET';
%let inccol2='ADDRESS';
%let inccol3='POSTAL';
%let inccol_count=3;
%macro keepInputColumns;
%if &INCCOL_COUNT = 1 %then
&inccol;
%else
%do k=1 %to (&INCCOL_COUNT);
var&k = VVALUEX(&&inccol&k);
%end;
KEEP
%do k=1 %to (&INCCOL_COUNT);
var&k
%end;
;
%mend;
data test1;
SET fetchlib.Table1;
%keepInputColumns;
run;
/*I switch this output to _WEBOUT in the actual stored process*/
proc json out='C:\Logs\Log1.txt';
options firstobs=1 obs=10;
export test1 /nosastags;
run;
有一些问题与此有关。输出使用var1,var2和var3作为列名,而不是实际的列名。当我将输出更改为_webout并使用BI Web Services运行时,它也不会被任何列过滤。
我觉得VVALUE(&& inccol&K)是正确的,而不是VVALUEX,如果我理解你在做什么正确(我不通过元数据服务器工作,所以我不确定)。我也建议保留引用的宏观变量被认为是正确的(尽管两者都是合法的);即%让inccol1 = STREET;然后vvalue(“&& inccolk。”)。 – Joe
是否是&inccol1等究竟是什么BI给你,或者它是一个文本变量是不是一个宏变量?如果前者那么我的答案会起作用。如果不是,那么这有点复杂。 – Joe
无论BI Web服务如何,存储过程都允许保存多个值的参数。他们很难合作。当传递3个值时,名为x的参数将生成变量x,x0,x1,x2和x3。 x0保存计数(3),并且x等于x1。 x1,x2和x3是三个参数。奇怪,但就我所知,这就是它的工作原理。 – Scampbell