2014-09-10 225 views
1

我要求SAS引擎在這三個代碼示例之間執行的操作有什麼區別?SAS PROC SQL在SAS中的差異

樣品A

PROC SQL; CREATE TABLE foo AS 
SELECT 
    aaa 
FROM 
    table1 
; 

CREATE TABLE bar AS 
SELECT 
    aaa 
FROM 
    foo 
; 

樣品B

PROC SQL; CREATE TABLE foo AS 
SELECT 
    aaa 
FROM 
    table1 
; 

PROC SQL; CREATE TABLE bar AS      /* Difference is here */ 
SELECT 
    aaa 
FROM 
    foo 
; 

樣品C

PROC SQL; CREATE TABLE foo AS 
SELECT 
    aaa 
FROM 
    table1 
; 

QUIT;            /* Difference is here */ 

PROC SQL; CREATE TABLE bar AS 
SELECT 
    aaa 
FROM 
    foo 
; 

回答

2

Proc SQL治療以分號結尾(;)作爲聲明,並將繼續這樣做,直到您提交quit ;。除了最後沒有quit聲明之外,第一個區塊是好的,第三個區塊也是如此。第二個塊有一個無關的Proc SQL,只是停止並開始SQL提交,這不是很好的代碼。第一個和第三個塊同樣適合編程,第一個塊比第三塊塊稍微快一點,但如果sql的第一部分失敗,那麼整個過程將失敗,而第三塊代碼稍慢,但如果第一個proc sql失敗,第二個仍然會運行。

+0

結果窗口中會有細微的差別(我知道這裏創建了表,所以它是無關緊要的)。 1會將兩個結果輸出到單個窗口,如果sql的第一部分失敗,則整個過程將失敗,則2和3將輸出到單獨的窗口 – Longfish 2014-09-11 12:39:25

+3

「不正確」。 'proc sql; create table foo as select * from bar; 創建表希望作爲select * from sashelp.class; quit;例如,「 '確實創建了」想要「數據集。它報告PROC以錯誤結束,這是正確的,但它不會停止執行proc(除非您處於批處理模式,但它會以任何方式結束)。 – Joe 2014-09-11 15:18:55

1

任何PROCQUIT結尾的語句允許您從其中運行多個「命令」。假設您正在使用SQL進行數據探索,則可以輸入您的PROC SQL語句,然後逐個提交併執行SQL命令,而不必每次都發出PROC SQL。當你完成你最後問題QUIT

這是爲那些從命令行界面工作在SAS中的人設計的,而不是那些在GUI中工作的人。

另一個例子是PROC DATASETS聲明。

SAS會自動識別PROC SQL語句的結尾,並自動爲您提交QUIT;RUN;代碼,如果它遇到某些其他語句邊界(例如另一個PROC的開頭)。不過,編程慣例總是明確地結束PROC聲明與適當的RUN;QUIT;語句,因爲它提高了代碼的可讀性。

個人與PROC SQL我寧願添加noprint選項(PROC SQL noprint;),以便它不會生成輸出到結果窗口。如果我想查看結果,我將使用資源管理器查看錶格,因爲我發現它更適合於該任務,並且可以讓我的結果窗口更清晰。我還想在每個PROC SQL內發佈不超過1條語句,以便我可以單獨運行它們並查看它們的性能。

+0

我認爲用'RUN'結束'PROC SQL'是'壞'?來源未經證實。 – JustinJDavies 2014-09-11 16:37:44

+0

正確 - 結束PROC SQL語句的正確語法是QUIT。我澄清了這個令人困惑的句子。謝謝。 – 2014-09-11 17:14:55