SAS 程序删除和数据集

Posted

技术标签:

【中文标题】SAS 程序删除和数据集【英文标题】:SAS procedures Delete and Datasets 【发布时间】:2012-04-28 22:06:49 【问题描述】:

我只是在学习 sas,看到了两个有趣的程序。

  proc Delete data = table;  run;

  proc datasets lib=Libr nolist;
        modify table;
           rename __first = second;
  quit;
  run;

还有几个关于它们的问题:

    为什么有些程序以quit 而不是run 结束?

    为什么datasets 使用quitrun 一起? (这是退出表的语句吗?)

    对于小任务,最好使用datasets-procedure 吗? (当然不是,但是为了什么?或者不使用它?)

    还有,哪种方法更快:proc deletesql-drop? (速度更快,需要多少数据)

【问题讨论】:

【参考方案1】:

    一些SAS 过程以QUIT 结尾,而不是RUN,因为它们在Interactive Mode 中运行。例如,在PROC GLM 中,只要SAS 窗口的顶部显示PROC GLM 正在运行(如果您使用的是Windows 版本),您就可以指定额外的模型语句。

    一些程序员已经养成了将QUITRUN 一起输入的习惯。我认为这实际上并不重要,因为使用QUIT 语句的过程在您输入它们后立即开始运行。我只使用其中一种。

    PROC DELETE 是不受支持的旧功能;它已被PROC DATASETS 正式取代,PROC DATASETS 是 SAS 中处理数据集的指定工具。 Mailing List Post.

SAS 中,我通常不会发现自己非常需要删除数据集。因为SAS 有效地管理了它的内存使用,而且因为现在 RAM 非常充足,所以我通常 90% 的工作来自我在会话开始时按需创建的临时数据集。

    和以前一样,PROC DELETE 现在已弃用,取而代之的是 PROC DATASETS。就哪个更快而言,不包括非常大的数据,我敢打赌它们之间几乎没有区别。然而,在处理永久 SAS 数据集时,我喜欢使用 PROC DATASETS 而不是 PROC SQL,只是因为我觉得使用 SAS 设计的方法而不是 SQL 实现(不是 100% ) 在我看来。

【讨论】:

sql实现怎么不是100%? 在 SQL 中可以做一些在 PROC SQL 中不能做的事情。立即想到的是更改变量的类型。 啊,我读到 drop table 在 SQL 实现中不是 100%。【参考方案2】:

WRT“运行”与“退出”:

一些 SAS 过程支持称为“运行组处理”的东西,这意味着该过程在看到“运行”时执行它被要求执行的任何工作;陈述。该过程继续执行,直到它看到“quit:”statemnet。事实上,一个“退出”;语句会自动插入一个“run;”声明是否还有工作要做。

PROC DATASETS 是这些过程之一。 “退出”;声明说程序没有更多的工作要做。考虑这个简单的例子:

proc datasets;
   change a=new_a;
run;
   delete new_a;
run;
quit;

第一个语句(更改)将现有数据集“a”重命名为“new_a”。第二条语句将删除该数据集。如果您没有包含“运行”;在本例中的语句(在“change”之后),该过程将失败,因为它会注意到“new_a”数据集不存在,因此不会执行任何一条语句。

也就是说,我自己很少使用 PROC DATASETS;我更喜欢使用 PROC SQL。

WRT:PROC DELETE 与使用 PROC SQL 的 DROP TABLE:

虽然 PROC DELETE 已正式“弃用”,但这意味着它将不再更改。从 SAS 库中删除数据对象是一个简单的过程;我用它所有的时间。与 PROC SQL 相比,它有一个特殊的优势。如果您使用 PROC DELETE 尝试删除不存在的数据集,您只会在日志中收到一条警告消息。但是,如果您尝试从 SQL 中执行 DROP TABLE 语句,您将收到错误并且您的 SQL 步骤将停止。在我的 ETL 脚本中创建加载到 Teradata 和 Oracle 等外部数据库的新表时,我一直使用 PROC DELETE。

啰嗦,我知道,但我希望这会有所帮助。

鲍勃

【讨论】:

【参考方案3】:

关于数据集或sql在删除表时是否更快,我调查了这个问题here。 Proc SQL 通常更快,这让我很惊讶。

【讨论】:

【参考方案4】:

我认为下面的代码可以删除工作库中的SAS数据集;

proc datasets lib=work memtype=data kill; 运行;

退出;

【讨论】:

【参考方案5】:

相信您会发现PROC DELETE 并没有消失,也不会很快消失。此外,对于某些类型的库,它通常比PROC DATASETS ... DELETE 形式的删除更快。根据我的经验,由 SPDS 管理的包含许多数据集的数据库可能会导致任何类型的 PROC DATASETS 性能非常差,因此我将始终使用 PROC DELETE

【讨论】:

以上是关于SAS 程序删除和数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SAS 删除包含 SAS 数据集的外部文件夹

第二章 导入数据到SAS | 逻辑库和SAS数据集

SAS 操作数据集的观测

Sas程序优化使用较少的工作空间

SAS:如何创建(日期变量)数据集

Lesson 1 数据集的建立