File 将文件中的代码用作SAS宏变量的内容
我有一系列文件,每个文件都包含SQL代码。 我想使用SAS使用该SQL运行passthrough查询。 由于这些文件经常发生变化,我只想用一种自动化的方法使SAS与这些文件保持同步。 我在想,如果我可以导入SQL文件并将其放入宏变量中,那么我就可以在SAS passthrough中使用宏,所有内容都将同步。 但除了SAS数据集,我不知道如何读取外部SQL,这在开始时没有多大意义。。。 例子: sqlcode.sqlFile 将文件中的代码用作SAS宏变量的内容,file,import,sas,File,Import,Sas,我有一系列文件,每个文件都包含SQL代码。 我想使用SAS使用该SQL运行passthrough查询。 由于这些文件经常发生变化,我只想用一种自动化的方法使SAS与这些文件保持同步。 我在想,如果我可以导入SQL文件并将其放入宏变量中,那么我就可以在SAS passthrough中使用宏,所有内容都将同步。 但除了SAS数据集,我不知道如何读取外部SQL,这在开始时没有多大意义。。。 例子: sqlcode.sql select * from table1 在SAS中: /*Somehow r
select *
from table1
在SAS中:
/*Somehow read sqlcode.sql into a macro variable sassql*/
proc sql;
connect to netezza (SERVER=MYSERVER DATABASE=MYDBS);
execute (
&sassql.
) by netezza;
;
quit;
编辑实际有效的新答案: 您可以通过数据步骤将整个查询读入宏变量,但查询中的字符总数限制为32767个,因为这是字符变量最多能容纳的字符数 我建议使用数据步骤逐行读取查询,将整个查询放入临时文件中,并使用
%include
包含临时文件:
filename query temp;
data _null_;
infile 'C:\My Documents\sql query.sql' end=eof truncover;
input @1 line $32767.;
file query;
if _n_=1 then put 'proc sql;
connect to netezza (SERVER=MYSERVER DATABASE=MYDBS);
execute (';
put line;
if eof then put ') by netezza;
quit;';
run;
%include query / source2;
filename query clear;
在这里,临时文件是“查询”,数据步骤逐行读取sql文件,并将每一行输出到临时文件。使用数据步骤读入文件,然后使用sql select执行以下查询:
data query_text;
infile 'sql query.sql';
input line $1000;
run;
proc sql;
select * from query_text into :sassql separated by ' ';
quit;
proc sql;
connect to netezza (SERVER=MYSERVER DATABASE=MYDBS);
execute (
%include_file(iFileName=c:\mypath\mysasfile.sas);
) by netezza;
;
quit;
整个读入文件将转储到一个宏变量。我曾多次遇到此问题,因此我编写了自己的
%include
宏版本,名为%include\u file()
。查看我的笔记,它应该可以工作,尽管如果您包含的文件包含宏标记,您可能需要调整宏引用功能
它可以处理任何大小的文件(因为它一次只读取一行,而不尝试将整个文件存储到变量中)
简单地说:
data query_text;
infile 'sql query.sql';
input line $1000;
run;
proc sql;
select * from query_text into :sassql separated by ' ';
quit;
proc sql;
connect to netezza (SERVER=MYSERVER DATABASE=MYDBS);
execute (
%include_file(iFileName=c:\mypath\mysasfile.sas);
) by netezza;
;
quit;
代码如下。我建议将其放入宏自动调用库:
%macro include_file(iFileName=);
%local filrf rc fid rc2;
%let filrf=myfile2;
%let rc=%sysfunc(filename(filrf, &iFileName, , lrecl=32767));
%let fid=%sysfunc(fopen(&filrf,i,32767,b));
%if &fid > 0 %then %do;
%let rc = %sysfunc(fread(&fid));
%do %while(&rc eq 0);
/* NOTE THE STACKED COMMANDS BECAUSE WE ARE RETURNING THE CONTENTS OF MACRO VAR C HERE AND DONT WANT WHITESPACE */
%let rc2=%sysfunc(fget(&fid,c,32767));%quote(&c)%let rc = %sysfunc(fread(&fid));
%end;
%end;
%else %do;
%put C &fid %sysfunc(sysmsg());
%end;
%let rc=%sysfunc(fclose(&fid));
%let rc=%sysfunc(filename(filrf));
%mend;
%include用于运行外部SAS代码,在这种情况下不起作用。至少,我没能让它工作。@ADJ你说得对,我最初的答案不起作用,因为它正在将
%include…
传递到数据库。上面更新的答案应该有效。实际上,您没有将%include
传递到数据库-不是真的。您可以在该上下文中使用SAS宏变量,并且工作正常<代码>%include只是奇怪地挑剔它的工作时间,原因可能与1970年代的大型机有关。