2014-09-10 140 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