解析远程 PROC SQL (SAS) 中的宏引用
Resolving a macro reference within a remote PROC SQL (SAS)
我在远程会话中引用远程会话中的变量时遇到了很多麻烦。
我想要实现的是动态日期查询。此时脚本可以正常使用静态 WHERE 语句。但是,我尝试引用宏变量的所有操作都以某种方式失败了。
这个有效:
WHERE SDD LIKE '2018-09%'
但事实并非如此:
WHERE SDD LIKE '2018-"&monthn."%'
or
WHERE SDD LIKE '2018-"monthn"%'
or
WHERE SDD LIKE %str(%')2018-&monthn.%str(%')
感谢所有建议
这大概是所有相关代码:
*-------------------------------------------------------------------;
* LOGIN TO zOS ;
*-------------------------------------------------------------------;
%let zos = ********;
signon zos userid=&userid. password=&passw.;
*-------------------------------------------------------------------;
* PREPARE LOCAL VARIABLES FOR TRANSFER TO REMOTE ;
*-------------------------------------------------------------------;
%SYSLPUT MONTHN = &monthn; /* MONTHN = 11 */
*-------------------------------------------------------------------;
* OPEN CONNECTION, DOWNLOAD FLIGHTS, CLOSE CONNECTION AND SIGNOFF ;
*-------------------------------------------------------------------;
rsubmit; /* REMOTE COMPUTING START */
%PUT &MONTHN; /* GET LOCAL VARIABLES */
----
Many lines of settings up the
wintel/sql connection
----
%SYSLPUT MONTHN = &monthn;
rsubmit;
%PUT &MONTHN; /* GET LOCAL VARIABLES */
proc sql dquote=sas;
create table TKLM1WINTEL as
SELECT *
FROM tables
WHERE SDD LIKE '2018-"&monthn."%'
/* WHERE SDD LIKE '2018-09%' */
PROC download data=TKLM1WINTEL out=DBFILE;
RUN;
endrsubmit;
endrsubmit; /* REMOTE COMPUTING END */
signoff;
好的,我只是在这个 source 的帮助下自己弄明白了。
正确的WHERE语句如下:
WHERE SDD LIKE %unquote(%str(%')2018-&monthn.%%str(%'))
像这样应该可以。
data abc;
input id sdd .;
datalines;
1 2018-091
2 2018-081
;
%let month =09;
proc sql;
select * from abc
where sdd like "2018-&month.%";
我在远程会话中引用远程会话中的变量时遇到了很多麻烦。
我想要实现的是动态日期查询。此时脚本可以正常使用静态 WHERE 语句。但是,我尝试引用宏变量的所有操作都以某种方式失败了。
这个有效:
WHERE SDD LIKE '2018-09%'
但事实并非如此:
WHERE SDD LIKE '2018-"&monthn."%'
or
WHERE SDD LIKE '2018-"monthn"%'
or
WHERE SDD LIKE %str(%')2018-&monthn.%str(%')
感谢所有建议
这大概是所有相关代码:
*-------------------------------------------------------------------;
* LOGIN TO zOS ;
*-------------------------------------------------------------------;
%let zos = ********;
signon zos userid=&userid. password=&passw.;
*-------------------------------------------------------------------;
* PREPARE LOCAL VARIABLES FOR TRANSFER TO REMOTE ;
*-------------------------------------------------------------------;
%SYSLPUT MONTHN = &monthn; /* MONTHN = 11 */
*-------------------------------------------------------------------;
* OPEN CONNECTION, DOWNLOAD FLIGHTS, CLOSE CONNECTION AND SIGNOFF ;
*-------------------------------------------------------------------;
rsubmit; /* REMOTE COMPUTING START */
%PUT &MONTHN; /* GET LOCAL VARIABLES */
----
Many lines of settings up the
wintel/sql connection
----
%SYSLPUT MONTHN = &monthn;
rsubmit;
%PUT &MONTHN; /* GET LOCAL VARIABLES */
proc sql dquote=sas;
create table TKLM1WINTEL as
SELECT *
FROM tables
WHERE SDD LIKE '2018-"&monthn."%'
/* WHERE SDD LIKE '2018-09%' */
PROC download data=TKLM1WINTEL out=DBFILE;
RUN;
endrsubmit;
endrsubmit; /* REMOTE COMPUTING END */
signoff;
好的,我只是在这个 source 的帮助下自己弄明白了。
正确的WHERE语句如下:
WHERE SDD LIKE %unquote(%str(%')2018-&monthn.%%str(%'))
像这样应该可以。
data abc;
input id sdd .;
datalines;
1 2018-091
2 2018-081
;
%let month =09;
proc sql;
select * from abc
where sdd like "2018-&month.%";