2015-10-23 274 views
3

我們目前使用的宏函數爲%runquit,詳情請見此處(http://analytics.ncsu.edu/sesug/2010/CC07.Blanchette.pdf)。下面顯示了%runquit宏。它基本上停止運行時錯誤是encounterd更多的SAS代碼,並可以作爲兩個runquit語句替換:proc sql outobs =觸發器SAS警告

%macro runquit; 
    ; run; quit; 
    %if &syserr %then %abort cancel; 
%mend; 

由於proc sql使用outobs語句觸發系統錯誤(即使指定了nowarn選項),這意味着當我們需要使用outobs=選項時,我們無法使用%runquit宏。

下面的例子將產生以下警告消息:

proc sql noprint outobs=3 /*nowarn*/; 
    create table tmp as 
    select age, count(*) as freq 
    from sashelp.class 
    group by 1 
    order by 2 desc 
    ; 
%runquit; 

警告:聲明由於OUTOBS = 3選項提前終止。

謝謝SAS完全不必要的警告。行爲顯然是預料之中的,因爲我明確地寫了代碼來要求它。當我們在set聲明中指定inobs=outobs=時,我看不到警告。爲什麼proc sql會得到特殊待遇?

有沒有什麼辦法可以禁止中outobs=選項的警告問題?另外,是否有另一種方法來限制從不會產生錯誤的proc sql輸出行?

+0

你可以添加更多的if/then邏輯基於水平的runquit宏記錄在這裏:http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer的.htm#a000208995.htm。 – JimL

+0

我猜proc sql是不同的,因爲inobs和outobs是非標準的SQL。大多數SQL風格使用「限制」語句,這在proc sql中不受支持。 – JimL

+0

@JimL好主意,但不幸的是,這是一個相當大的錯誤我會讓它選擇退出。返回的代碼是syserr = 4,它對應於「執行成功,但帶有警告消息」。這可以是任何從自動類型轉換到未初始化的變量,即。首先我試圖抓住的東西。 –

回答

2

假設您可以執行完整的SQL語句,可以通過包含obs限制的數據步驟視圖來解決此問題。

proc sql noprint ; 
    create table tmp as 
    select age, count(*) as freq 
    from sashelp.class 
    group by 1 
    order by 2 desc 
    ; 
%runquit; 

data tmp_fin/view=tmp_fin; 
    set tmp(obs=3); 
%runquit; 
+0

如果你想避免I/O,你也可以使用視圖。 –

+0

'創建表tmp(obs = 10)'不起作用嗎? – Quentin

+0

@Quentin不幸的是,它沒有。例如:'proc sql noprint; create table tmp(obs = 1)as select * from sashelp.class ; quit;' –

0

或者使SQL語句成爲視圖並使用數據步驟來創建數據集。

proc sql noprint ; 
    create view tmp_view as 
    select age 
     , count(*) as freq 
    from sashelp.class 
    group by 1 
    order by 2 desc 
    ; 
quit; 
data tmp; 
    set tmp_view(obs=3) ; 
run; 
0

這可能是你的選擇考慮I/O一個是不是一個巨大的限制,這裏的復位outobs =nowarn的伎倆,但在成本的IO選項。

proc sql; 
    create table test as 
    select * from sashelp.class; 

    reset outobs=10 nowarn; 

    create table test1 as 
    select * from sashelp.class; 
quit; 
+0

實際上,這仍然會觸發'%abort cancel;',所以它在我正在使用的場景中不起作用。 –