1

我是 SAS 新手,我正在尝试从远程服务器检索数据。

下面是我试图在远程服务器上执行的代码:

rsubmit;
libname abc'server/sasdata'; *This is where the datasets are located;   
data all2009;
    set abc.file_2007:; 
    by index date time;
    where index in (var1) and time between '8:30:00't and '12:00:00't;
run;
endrsubmit;

目前,我正在尝试传递var1包含index“查询”需要的字符串的变量。 var1在我的本地计算机上进行评估并包含 value 'abc'

但是,由于var1是在本地评估的,因此尝试引用远程服务器上的变量会产生错误,因为var1那里不存在。

如果我按如下方式运行代码(使用 的显式值'abc'),它运行良好:

...
set abc.file_2007:; 
by index date time;
where index in ('abc') and time between '8:30:00't and '12:00:00't;
...

我需要动态运行这个“查询”。在尝试执行包含在and中的代码之前,有没有办法强制var1将其替换为实际值(即) ?'abc'rsubmitendrsubmit


更新: 整个代码(我省略了远程服务器特定的代码,但我可以连接没有问题):

LIBNAME local 'C:\...\Pulled Data\New\';
FILENAME csvfile 'C:\...\Pulled Data\New\indexes.txt';

%macro getthedata(nrows,ystart,yend); *nrows is the number of rows in the text file;

    %GLOBAL var1 var2 var3 var4;

    %do i=1 %to &nrows;
        %do m=&ystart %to &yend;

            DATA local.trow; 
               INFILE csvfile FIRSTOBS=&i OBS=&i;
               INPUT var1 $ var2 $ var3 $ var4 $;
            RUN;

            PROC PRINT DATA = local.trow;
            TITLE "Title - &i. &var1. &m";
            var var1 var2 var3 var4;
            RUN;

            proc export data=local.trow
                outfile="C:\...\Pulled Data\New\Indices_&i._&m..csv"
                dbms=csv replace;
            run;

            signon username=_prompt_;
            %syslput VAR1 = &var1;
            rsubmit;
                    libname abc'server/sasdata';    
                    data all2009;
                         set abc.file_2007:; 
                         by index date time;
                         where index in (&VAR1) and time between '8:30:00't and '12:00:00't;
                    run;
            endrsubmit;

        %end;
    %end;
%mend getthedata;

Options MPRINT;

%getthedata(1,2007,2007)

使用此代码,该PROC PRINT语句可以正确打印显示var变量及其值的表。该TITLE语句正确地评估了im变量,但var1完全放弃了。

proc export语句会创建正确的 CSV 文件,其中包含每个var变量的预期值。

正如建议的那样,我尝试将var变量声明为 GLOBAL,但这似乎没有任何效果。该代码似乎仍然无法正确地将var1变量传递给远程服务器。

&VAR1同样,如果我用变量的实际字符串值替换,代码工作得很好。

我得到的错误是:

ERROR: Syntax error while parsing WHERE clause.
ERROR 22-322: Syntax error, expecting one of the following: a quoted string,
              a numeric constant, a datetime constant, a missing value.

难道是WHERE这种情况下的子句不能接受变量?

4

1 回答 1

4

如果将 VAR1 值放在宏变量中,则可以在本地机器/会话上/中使用 %SYSLPUT 命令将该宏传递给远程服务器。

你把它放在 SIGNON 和 RSUBMIT 命令之间。

Signon;
%SYSLPUT VAR1=&var1;
RSubmit;

然后 &VAR1 在您的远程会话中可用。根据您在 &VAR1 中传递的内容,您可能需要一些宏引用。如果您对此方法有问题,请发布值。

于 2013-08-21T18:51:36.307 回答