1

我要求 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
; 
4

2 回答 2

2

Proc SQL将以分号 ( ;) 结尾的每个部分视为一个声明,并将继续这样做,直到您提交quit ;. 除了最后没有quit声明之外,第一个块很好,第三个也是。第二个块有一个无关的Proc SQL,它只是停止和启动 SQL 提交,这不是很好的代码。第一个和第三个代码块同样适合编程,第一个会比第三个运行得稍微快一些,但是如果 sql 的第一部分失败,那么整个 proc 就会失败,而第三个代码块会稍微慢一些,但是如果第一个proc sql失败,第二个仍然会运行。

于 2014-09-11T08:30:25.590 回答
1

任何PROC以 a 结尾的语句都QUIT允许您在其中运行多个“命令”。假设您正在使用 SQL 进行数据探索,您可以输入您的PROC SQL语句,并一个接一个地提交和执行您的 SQL 命令,而不必PROC SQL每次都发出 a。完成后,您终于发出QUIT.

这是为那些从命令行界面在 SAS 中工作的人设计的,而不是为那些在 GUI 中工作的人设计的。

另一个例子是PROC DATASETS语句。

如果遇到某些其他语句边界(例如另一个 PROC 的开头),SAS 将自动识别语句的结尾并自动为您提交代码PROC SQL。但是,始终以适当的or语句显式结束语句是一种很好的编程习惯,因为它可以提高代码的可读性。QUIT;RUN;PROCRUN;QUIT;

我个人PROC SQL更喜欢添加 noprint 选项 ( PROC SQL noprint;),这样它就不会向结果窗口生成输出。如果我想查看结果,我将使用资源管理器查看表格,因为我发现它更适合该任务并且它使我的结果窗口更清晰。我还喜欢在每个语句中发出不超过 1 条语句,PROC SQL以便我可以单独运行它们并查看它们的性能。

于 2014-09-11T14:36:16.660 回答