首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文件中的代码用作SAS宏变量的内容

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

Stack Overflow用户
提问于 2015-05-22 17:02:20
回答 3查看 552关注 0票数 0

我有一系列文件,每个文件都包含SQL代码。我想使用SAS来使用那个SQL来运行通通查询。由于这些文件经常更改,我只想要一种自动化的方法来保持SAS与这些文件的同步。我在想,如果我能够导入SQL文件并将其放入宏变量中,那么我就可以在我的SAS通道中使用这个宏,并且一切都是同步的。但是,除了SAS数据集之外,我不知道如何读取外部SQL,这从一开始就没有什么意义.示例: sqlcode.sql

代码语言:javascript
复制
select *
from table1

在SAS中:

代码语言:javascript
复制
/*Somehow read sqlcode.sql into a macro variable sassql*/

proc sql;
connect to netezza (SERVER=MYSERVER DATABASE=MYDBS);

execute (
&sassql.

) by netezza;

;
quit; 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-22 17:12:24

编辑-实际有效的新答案:

您可以通过数据步骤将整个查询读入宏变量,但查询中的总字符将被限制为32,767个,因为这是字符变量所能容纳的最多字符。

我建议使用数据步骤逐行读取查询,将整个查询放入临时文件,并使用%include包括临时文件

代码语言:javascript
复制
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;

在这里,temp文件是"query",数据步骤逐行读取sql文件,并将每一行输出到临时文件。

票数 2
EN

Stack Overflow用户

发布于 2015-05-22 18:45:48

使用数据步骤读取文件,然后使用sql select查询跟踪这些查询,如下所示:

代码语言:javascript
复制
data query_text;
    infile 'sql query.sql';
    input line $1000;
run;

proc sql;
    select * from query_text into :sassql separated by ' ';
quit;

整个读取文件将转储到一个宏变量中。

票数 0
EN

Stack Overflow用户

发布于 2015-05-26 16:52:41

我遇到过几次这个问题,所以我编写了自己的名为%include的宏版本%include_file()。回顾一下我的笔记,它应该可以工作,尽管如果您所包含的文件包含宏标记,您可能需要调整宏引用函数。

它将处理任意大小的文件(因为它每次只读取一行文件,而不尝试将整个文件存储到变量中)。

只需这样称呼:

代码语言:javascript
复制
proc sql;
connect to netezza (SERVER=MYSERVER DATABASE=MYDBS);
execute (
  %include_file(iFileName=c:\mypath\mysasfile.sas);
) by netezza;
;
quit; 

代码在下面。我建议把它放在宏自动调用库中:

代码语言:javascript
复制
%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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30402205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档