如何将libname分配给SAS中的工作数据库?

如何将libname分配给SAS中的工作数据库?,sas,enterprise-guide,Sas,Enterprise Guide,我们有一个企业指南项目,其中有多个流程流。 每个流程流的输出都保存到名为“SAVE”的特定库中,该库由LIBNAME语句定义。这样做的目的是,我们可以更轻松地跳转并处理任何流程,而无需运行上述所有流程(当然,流程流除外,它将使用LIBNAME语句初始化SAVE Library) 但是,当我们想在生产服务器上运行此代码时,我们希望此保存库指向SAS WORK Data Library,因为我们不需要在数据之间使用它 是否可以使用LIBNAME语句(例如“LIBNAME SAVE SAS.WORK;

我们有一个企业指南项目,其中有多个流程流。 每个流程流的输出都保存到名为“SAVE”的特定库中,该库由LIBNAME语句定义。这样做的目的是,我们可以更轻松地跳转并处理任何流程,而无需运行上述所有流程(当然,流程流除外,它将使用LIBNAME语句初始化SAVE Library)

但是,当我们想在生产服务器上运行此代码时,我们希望此保存库指向SAS WORK Data Library,因为我们不需要在数据之间使用它


是否可以使用LIBNAME语句(例如“LIBNAME SAVE SAS.WORK;”)将库指向工作数据库?

好的,我找到了一种方法

%let workLocation=%sysfunc(getoption(work));
libname SAVE "&workLocation.";
还有更简单的解决方案:

libname SAVE (work);

您可以做的一件事是重新分配工作库,使其指向保存库所在的位置


在这里,在第1点中,他们解释了如何做到这一点:

定义libref使用LIBNAME语句。要查找现有libref使用的路径,请使用PATHNAME()函数

libname save %sysfunc(quote(%sysfunc(pathname(work)))) ;

使用此技巧时要小心,因为SAVE.memname和WORK.memname现在将引用相同的物理文件。在您的开发环境中工作的代码可能会因为名称冲突而无法工作。

True这是一个很酷的想法,这样我们就可以委托SAS来处理(删除)最终存储在SAVE libref上的任何内容。唯一的问题是,然后我们需要定义一些临时文件夹来保存它,这样我们就可以在生产服务器上创建额外的(垃圾)文件夹,这对于这种特殊情况来说是不可行的。只使用双引号文本比在
%sysfunc()
调用中包装
quote()
函数更简单。这将变成:
libname保存“%sysfunc(路径名(工作))”
.Hello Tom,关于您的评论,所以,只要我注意我在工作中命名的所有数据集。*库不会与SAVE.*库冲突,我应该没事。对。在您的开发环境中,SAVE与WORK是不同的位置,您可以将dataset SAVE.X设置为与dataset WORK.X不同。如果以后在程序中引用WORK.X,则代码的工作方式可能会有所不同,因为创建SAVE.X时您过度写入了任何现有的WORK.X数据集。LIBNAME语句可能不需要QUOTE()函数,但仍有许多DOS命令无法处理带有嵌入空格的无引号路径。因此,包含路径的宏变量通常会包含引号。在这些情况下,QUOTE()函数调用确保嵌入的引号正确地折叠起来。