是否可以在 SAS 元数据中获取分配(预分配和非预分配)到应用程序服务器的库列表?
我可以使用 dictionary.libnames 但它只列出预先分配的库。
是否可以在 SAS 元数据中获取分配(预分配和非预分配)到应用程序服务器的库列表?
我可以使用 dictionary.libnames 但它只列出预先分配的库。
假设您只想找出所有可用的库,并且有一个sasadm@saspw
可以查看它们的帐户(例如 ),那么您应该能够使用该metadata_getnobj
函数进行迭代。像这样的东西:
nobj=metadata_getnobj("omsobj:SASLibrary?@Id contains '.'",n,uri);
否则文档中的示例应与您正在执行的操作相匹配:
data _null_;
length uri $256;
nobj=0;
n=1;
/* Determine how many machine objects are in this repository. */
nobj=metadata_getnobj("omsobj:SASLibrary?@Id contains '.'",n,uri);
put nobj=; /* Number of machine objects found. */
put uri=; /* URI of the first machine object. */
run;
do n = 1 by 1 until (n lt 0);
然后,您可以使用循环或类似方法遍历它们,并使用该metadata_getattr
函数获取您想要的关于每个uri
. 例如,您可以查看这个 SAS Communities question;那里的代码应该可以工作(他们的问题不是代码,而是他们的机器设置)。像这样的东西:
data _null_;
length uri $256;
nobj=0;
n=1;
uri=' ';
length name engine libref $256;
call missing(of name engine libref);
nobj=metadata_getnobj("omsobj:SASLibrary?@Id contains '.'",n,uri);
/* Determine how many machine objects are in this repository. */
do n = 1 to nobj;
nobj=metadata_getnobj("omsobj:SASLibrary?@Id contains '.'",n,uri);
rc=metadata_getattr(uri,'Name',name);
rc=metadata_getattr(uri,'Engine',engine);
rc=metadata_getattr(uri,'Libref',libref);
put name= engine= libref=;
end;
run;
这将仅包括元数据库 - 不包括处于活动状态但仅在 SAS 代码中定义的库。对于后者,您确实需要使用dictionary.libnames
.
如果您有很多库,最快的方法是使用 proc 元数据。
下面是SASjs 核心宏的摘录(这个:https ://github.com/sasjs/core/blob/main/meta/mm_getlibs.sas )
/* get list of libraries */
filename response temp;
proc metadata in=
'<GetMetadataObjects>
<Reposid>$METAREPOSITORY</Reposid>
<Type>SASLibrary</Type>
<Objects/>
<NS>SAS</NS>
<Flags>%eval(2048+256+8)</Flags>
<Options/>
</GetMetadataObjects>'
out=response;
run;
/* create an XML map to read the response */
filename sxlemap temp;
data _null_;
file sxlemap;
put '<SXLEMAP version="1.2" name="SASLibrary">';
put '<TABLE name="SASLibrary">';
put '<TABLE-PATH syntax="XPath">//Objects/SASLibrary</TABLE-PATH>';
put '<COLUMN name="LibraryId">><LENGTH>17</LENGTH>';
put '<PATH syntax="XPath">//Objects/SASLibrary/@Id</PATH></COLUMN>';
put '<COLUMN name="LibraryName"><LENGTH>256</LENGTH>>';
put '<PATH syntax="XPath">//Objects/SASLibrary/@Name</PATH></COLUMN>';
put '<COLUMN name="LibraryRef"><LENGTH>8</LENGTH>';
put '<PATH syntax="XPath">//Objects/SASLibrary/@Libref</PATH></COLUMN>';
put '<COLUMN name="Engine">><LENGTH>12</LENGTH>';
put '<PATH syntax="XPath">//Objects/SASLibrary/@Engine</PATH></COLUMN>';
put '</TABLE></SXLEMAP>';
run;
libname _XML_ xml xmlfileref=response xmlmap=sxlemap;
/* sort the response by library name */
proc sort data=_XML_.saslibrary out=work.metalibs;
by libraryname;
run;
正如 Joe 所提到的,要找到分配给特定应用程序服务器的那些,您需要使用每个库 id 进一步迭代以获取属性。为此,拥有元数据浏览器会有所帮助。如果您没有 Base SAS(内置 metabrowse),请随时与我联系,我会为您发送一个工具。