File 将文件中的代码用作SAS宏变量的内容

File 将文件中的代码用作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

我有一系列文件,每个文件都包含SQL代码。 我想使用SAS使用该SQL运行passthrough查询。 由于这些文件经常发生变化,我只想用一种自动化的方法使SAS与这些文件保持同步。 我在想,如果我可以导入SQL文件并将其放入宏变量中,那么我就可以在SAS passthrough中使用宏,所有内容都将同步。 但除了SAS数据集,我不知道如何读取外部SQL,这在开始时没有多大意义。。。 例子: sqlcode.sql

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年代的大型机有关。