1

我正在构建一个利用表对象的 SAS 元数据 ID(或 URI)的实用程序。当库使用 BASE 引擎时,以下代码可以很好地获取 ID:

%let mylib=SOMELIB;
data output (keep=uri dataname);
  length uri $100 dataname $256;
  uri='';
  i=1;
  do until (rc<0);
    rc=metadata_getnasn("omsobj:SASLibrary?@Libref='&mylib'","Tables",i,uri);
    put rc=;
    prc=metadata_getattr(uri,"Name",dataname);
    if rc>=0 then output;
    i+1;
    put i=;
  end;
run;

然而,对于其他库引擎(例如 OLEDB、ODBC、REMOTE),SAS 会将信息存储在不同的属性中(例如,在“UsingPackages/[my db]/Tables”下)。我可以为遇到的每个库引擎编写条件逻辑,但想知道是否有更简单/更通用的方法来获取表 ID?

反过来也会出现同样的问题(如果我搜索表,我仍然需要 SASLibrary 来确保它是唯一的)。

4

2 回答 2

2

本文中的代码对我们的 SAS 管理员非常有帮助:

http://support.sas.com/documentation/cdl/en/lrmeta/63180/HTML/default/viewer.htm#p1k9zipe59ha2an1pq34gu143lay.htm

示例:列出库及其服务器上下文

该程序使用 SAS 元数据 DATA 步进函数返回有关库的更详细信息。结果将返回到工作库中的库数据集。请求的数据包括库元数据 ID、库名称、libref、引擎、文件系统上的路径(如果是 DBMS 数据,则为 DBMS 路径)以及与库关联的服务器上下文。

它会给你你想要的一切,甚至更多。

于 2015-11-12T16:51:05.270 回答
1

我今天为此写了一个宏,位于:https ://github.com/sasjs/core/blob/main/meta/mm_gettableid.sas

转载如下:

/**
  @file mm_gettableid.sas
  @brief Get the metadata id for a particular table
  @details Provide a libref and table name to return the corresponding metadata id
  in an output datataset.

  Usage:

      - get a table id
      %mm_gettableid(libref=METALIB,ds=SOMETABLE,outds=iwant)

  @param libref= The libref to search
  @param ds= The input dataset to check
  @param outds= the dataset to create that contains the `tableuri`
  @param mDebug= set to 1 to show debug messages in the log

  @returns outds  dataset containing `tableuri` and `tablename`

  @version 9.3
  @author Allan Bowe

**/

%macro mm_gettableid(
     libref=
    ,ds=
    ,outds=work.mm_gettableid
    ,mDebug=0
)/*/STORE SOURCE*/;

%local mD;
%if &mDebug=1 %then %let mD=;
%else %let mD=%str(*);
%&mD.put Executing &sysmacroname..sas;
%&mD.put _local_;

data &outds;
  length uri usingpkguri id type tableuri tablename tmpuri $256;
  call missing(of _all_);
  keep tableuri tablename;
  n=1;
  rc=0;
  if metadata_getnobj("omsobj:SASLibrary?@Libref='&libref'",n,uri)<1 then do;
    put "Library &libref not found";
    stop;
  end;
  &mD.putlog "uri is " uri;
  if metadata_getnasn(uri, "UsingPackages", 1, usingpkguri)>0 then do;
    rc=metadata_resolve(usingpkguri,type,id);
    &mD.putlog "Type is " type;
  end;

  if type='DatabaseSchema' then tmpuri=usingpkguri;
  else tmpuri=uri;
  
  t=1;
  do while(metadata_getnasn(tmpuri, "Tables", t, tableuri)>0);
    t+1;
    rc= metadata_getattr(tableuri, "Name", tablename);
    &mD.putlog "Table is " tablename;
    if upcase(tablename)="%upcase(&ds)" then do;
      output;
    end;
  end;
run;

%mend;
于 2015-11-12T18:09:58.223 回答