2015-09-25 61 views
2

我有一個SAS存儲過程,它通過webout執行一些html輸出。 在某些情況下(例如沒有數據可用),我想放置一個自定義的錯誤消息,並停止進一步執行。正確結束SAS存儲過程

我有一個萬客隆的解決方案,它迄今運行良好:

%if &varnobs = 0 %then %do; 
data _null_; 
    file _webout; 
    put " &text1"; 
    put " &text2"; 
    put " &text3"; 
run; 
ENDSAS; 
%end; 

但現在我被告知,使用ENDSAS是不是我們公司內部允許的,因爲它可以有各種副作用,也不僅可以停止進程,還可以停止完成會話。

現在我正在尋找替代品,我也嘗試了幾個選項的中止語句,但有一個問題是,中止放在日誌中的錯誤消息,以便不顯示我的自定義消息,但薩斯錯誤信息。同樣在中止文檔中指出(abort),即放棄不僅停止進程,而且會話。

我知道有像if-else或goto這樣的編程方式替代方法,而不是停止進程,但這不適用於我的特定問題。

所以,問題是:

執行過程中如何停止存儲過程,而不停止會議,沒有其他副作用,並沒有一個SAS錯誤消息?

回答

0

這是一個有趣的,棘手的地區。在某些設置中,設置系統選項:

options obs=0 noreplace; 

可能充當代理。

0

您可以嘗試%return以安靜地退出宏,但可能必須設置用於調用宏的處理程序(如果有)。

0

你可以做,如果其他的方法來防止運行額外的代碼和打印自定義錯誤消息作爲

%if &data ne "" %then; 
    *your code; 

%else 
    data _null_; 
    file _webout; 
    put 'html code of custom message'; 
    run; 
0

SAS是可怕的錯誤處理,所以我的建議是,以避免錯誤儘可能;-)

除了和 %abort cancel之外,還有一些有限的選項:

笑話不談,

您可以嘗試將支票簽字後的所有代碼移入有條件執行的%include語句。喜歡的東西:

%macro conditional_execute; 
    %if &some_condition %then %do; 
    %include "rest_of_logic_to_perform.sas"; 
    %end; 
    %else %do; 
    %put ERROR: CUSTOM ERROR MESSAGE HERE; 
    %end; 
%mend; 

原因的包括,而不是把所有的代碼宏的內部是,我假設仍有待執行的處理的大量。如果它是一個短的代碼,那麼是的,你可以把它放在%if的條件之內。