2012-09-11 220 views
3

我有幾個數據集,我想在我的SAS過程完成後刪除。我使用這樣的說法:刪除SAS數據集

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

其中

&sysparm計算爲一個數字和templibname。但是,我在日誌文件中收到以下錯誤:

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; 

回答

8

沒有什麼明確你的代碼錯誤,除了上次運行不需要(QUIT就足夠了PROC DATASETS)。我使用這些參數創建了數據集,並且提供的代碼正常工作。當proc語句導致proc語句不能編譯時,通常會出現這種錯誤。例如:

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

會導致你提供,幾乎其他任何不正常結束(雖然這種性質的大部分其他錯誤會導致與前面的語句第二個錯誤消息)沿着錯誤消息。

+0

我已經編輯了問題,給我詳細..我難倒! – Alex

+1

你完全正確。這是一個評論,之前的proc線是搞砸了。爲什麼在這之前'* hi'作爲一行無效? – Alex

+1

糟糕...那些流浪的缺少分號總是讓你... – Joe

0

我懷疑SAS無法解析您帶入您的& sysparm宏的任何有價值的東西。你檢查了它的價值嗎?

1

看着你的日誌,看起來你並沒有執行你的PROC DATASETS語句,這樣`delete'語句就顯示在開放代碼中。正如Joe所說,你的代碼中可能有一個流浪的角色。如果不是,請從SAS日誌中重新發布更多信息。包含上一步邊界的所有內容。

1

您還可以使用它運行速度快,但一直被認爲是一個「不贊成」的程序如下:

Proc Delete Data = Temp._all_; *This will delete all datasets in temp; 
run; 
+3

實際上,PROC DELETE已被棄用一段時間。但在9.4它再次被記錄(undeprecated?)。 https://support.sas.com/documentation/cdl/en/proc/67916/HTML/default/viewer.htm#n1469bsvzgd33jn0z4xecxmx2bgo.htm – Quentin

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);

+0

要將名稱列表傳遞給宏,不需要使用像PARMBUFF這樣的技巧。只需在名稱之間使用空格而不是逗號。 – Tom

0

大多數開發人員已經很好地回答了這個問題。不過,我想提供更多信息。

其實,運行或退出步驟是可選的。你把它表明數據步驟ua的調查完成。

SAS程序步驟終止時遇到的這些中的一個:

  • 「下一個」 DATA或PROC步驟
  • 達到一個顯式的步邊界(或者RUN的開始;或退出;適當)
  • 如果您以「批處理」模式(例如大型機上的SYSIN DD *)提交作業並且遇到輸入文件的末尾(這將在主機上爲* /)。

而且這個你可以參考以下鏈接... https://communities.sas.com/t5/Base-SAS-Programming/Why-use-QUIT-with-proc-SQL/td-p/97992