0

是否可以在 SAS 元数据中获取分配(预分配和非预分配)到应用程序服务器的库列表?

我可以使用 dictionary.libnames 但它只列出预先分配的库。

4

2 回答 2

1

假设您只想找出所有可用的库,并且有一个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.

于 2021-07-11T14:14:04.390 回答
0

如果您有很多库,最快的方法是使用 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),请随时与我联系,我会为您发送一个工具。

于 2021-07-13T06:56:58.867 回答