【发布时间】:2015-06-18 15:02:00
【问题描述】:
我正在尝试使用 PARMBUFF 宏来重复具有 20 个不同客户端定义的数据步骤(下面的一个示例)。
DATA _NULL_;
%GLOBAL bank1;
%LET bank1 = O.OWNER LIKE 'XXXXX%';
RUN;
数据步骤将创建由上面创建的客户端宏变量定义的单独表。
%MACRO CLIENTBUILD/PARMBUFF;
%LET N=%SYSFUNC(COUNTW(&SYSPBUFF,%STR(,)));
%DO I=1 %TO &N;
%LET CLIENT=%SCAN(%QSYSFUNC(COMPRESS(%BQUOTE(&SYSPBUFF),%STR(%(%)))),&I,%STR(,));
CREATE TABLE CLIENT AS
SELECT DISTINCT C.DATE,
C.TIME,
C.RELEASE,
C.TASK
FROM CALLS C
INNER JOIN OWN_GRNT O ON SUBSTR(C.TASK,1,9)= O.TASK
AND &CLIENT
;
%END;
%MEND;
我想使用宏的名称(字符串)创建此表……但在引用宏的字符串以获取表的名称时遇到问题。 我尝试使用
%MACRO CLIENTBUILD/PARMBUFF;
%LET N=%SYSFUNC(COUNTW(&SYSPBUFF,%STR(,)));
%DO I=1 %TO &N;
%LET CLIENT=%SCAN(%QSYSFUNC(COMPRESS(%BQUOTE(&SYSPBUFF),%STR(%(%)))),&I,%STR(,));
CREATE TABLE '&CLIENT' AS
SELECT DISTINCT C.DATE,
C.TIME,
C.RELEASE,
C.TASK
FROM CALLS C
INNER JOIN OWN_GRNT O ON SUBSTR(C.TASK,1,9)= O.TASK
AND &CLIENT
;
%END;
%MEND;
Then calling the macro out with –
PROC SQL;
%CLIENTBUILD(&NCT);
QUIT;
但这会导致错误:
ERROR: The value &CLIENT is not a valid SAS name.`
是否有一种解决方案可以调用依赖于用于定义客户端的宏变量的宏标题?解决后,我想用 .... 创建每个客户端数据集。
Proc SQL;
%CLIENTBUILD(&bank1,&bank2,&bank3,..........);
QUIT;
【问题讨论】:
-
删除 &CLIENT 周围的单引号 -- 如
CREATE TABLE &client AS...单引号掩盖了 &CLIENT 变量的解析。 SAS 表不能以&开头,这是给你的错误。 -
问题在于它将解决实际的宏定义(O.OWNER LIKE 'XXXXX%'),而不仅仅是名称 - “bank1”...我只希望它在在“WHERE &CLIENT”部分的底部(原始帖子中的错误......改为 AND &CLIENT),并使用字符串(bank1)作为表的名称......
-
使用宏引用(例如
%nrstr)来控制分辨率。如果你想要bank1而不是&bank1,你会遇到一些困难,因为这不是 SAS 宏变量的工作方式。您需要重新考虑这里的方法 - 特别是,听起来您应该传递两个参数,而不是一个。 -
接受了这个想法,但在使用两个参数构造 PARMBUFF 时遇到问题...尝试包含一个额外的 "%LET VAR2=%SCAN(%QSYSFUNC(COMPRESS(%BQUOTE(&SYSPBUFF),%STR (%(%)))),&I,%STR(,));"在宏构建中...然后执行为 %CLIENTBUILD(&BANK1,&VAR2);但没有成功。
标签: sas