3

在我的 SAS 程序完成后,我想删除几个数据集。我正在使用这个语句:

proc datasets lib=temp;
    delete xtemp2&sysparm trades&sysparm tickers&sysparm;
quit;
run;

在哪里

&sysparm计算为一个数字和temp一个libname。但是,我在日志文件中收到以下错误:

142             delete xtemp2&sysparm trades&sysparm tickers&sysparm;
            ______
            180
ERROR 180-322: Statement is not valid or it is used out of proper order.

有人知道这个问题吗?

编辑:

Here is some more of the log file to address the answer:
NOTE: "OUT_CSV" file was successfully created.
NOTE: PROCEDURE EXPORT used (Total process time):
      real time           0.27 seconds
      cpu time            0.12 seconds


142             delete xtemp2&sysparm trades&sysparm tickers&sysparm;
        ______
        180
ERROR 180-322: Statement is not valid or it is used out of proper order.

这是proc之前的代码:

proc export data=temp.xtemp2&sysparm outfile=out_csv dbms=csv replace;
run;

proc datasets lib=temp;
    delete xtemp2&sysparm trades&sysparm tickers&sysparm;
quit;
run;
4

6 回答 6

8

您的代码没有明显错误,除了不需要最后一次 RUN (对于 PROC DATASETS 来说,QUIT 就足够了)。我使用这些参数创建了数据集,并且提供的代码运行良好。当您在 proc 语句之前有一些东西导致 proc 语句无法编译时,通常会出现该错误。例如:

*
proc datasets lib=temp;
    delete xtemp2&sysparm trades&sysparm tickers&sysparm;
quit;

会导致您提供的错误消息,以及几乎所有其他未正确结束的错误消息(尽管大多数其他这种性质的错误会导致前面的语句出现第二条错误消息)。

于 2012-09-11T14:58:04.107 回答
1

您还可以使用以下运行速度快但已被视为“已弃用”的程序:

 Proc Delete Data = Temp._all_;    *This will delete all datasets in temp;
 run;
于 2012-09-11T17:40:28.993 回答
1

查看您的日志,您似乎没有执行您的PROC DATASETS语句,因此“删除”语句出现在开放代码中。正如乔所说,您的代码中可能有一个杂散字符。如果没有,请从您的 SAS 日志中重新发布更多信息。包括上一步边界中的所有内容。

于 2012-09-11T15:40:04.580 回答
0

我怀疑 SAS 无法解析您带入 &sysparm 宏的任何有价值的东西。你检查过它的价值吗?

于 2012-09-11T15:36:08.350 回答
0

大多数开发人员已经很好地回答了这个问题。但是,我想提供更多信息。

实际上,运行或退出步骤是可选的。你把它表示为数据步骤ua调查的完成。

SAS 过程步骤在遇到以下情况之一时终止:

  • “下一个”DATA 或 PROC 步骤的开始
  • 达到明确的步骤边界(RUN;或 QUIT;视情况而定)
  • 如果您以“批处理”模式提交作业(例如在大型机上的 SYSIN DD * 中)并且遇到输入文件的结尾(在大型机上将是 */)。

除此之外,您可以参考以下链接... https://communities.sas.com/t5/Base-SAS-Programming/Why-use-QUIT-with-proc-SQL/td-p/97992

于 2017-07-12T11:51:52.983 回答
0

我正在使用这个

%macro drop / parmbuff store source
    DES="drop(table1,...tableN): Drops tables if they exists";
    %let num=1;
    %let stepneeded=0;
    %let stepstarted=0;
    %let dsname=%scan(&syspbuff,&num,',()');
    %do %while(&dsname ne); 
        %if %sysfunc(exist(&dsname)) %then %do;
            %let stepneeded=1;
            %if (&stepstarted eq 0) %then %do;
                proc sql;
                %let stepstarted=1;
            %end;
                drop table &dsname;
        %end;
        %if %sysfunc(exist(&dsname,view)) %then %do;
            %let stepneeded=1;
            %if (&stepstarted eq 0) %then %do;
                proc sql;
                %let stepstarted=1;
            %end;
                drop view &dsname;
        %end;
        %let num=%eval(&num+1);
        %let dsname=%scan(&syspbuff,&num,',()');
    %end;
    %if &stepstarted %then %do;
        quit;
    %end;
%mend drop;

那么就%drop(work.mytable);

于 2016-05-04T11:57:58.740 回答