Generic way to get SAS Table metadata URI

前端 未结 2 1355
梦谈多话
梦谈多话 2021-01-24 06:12

I\'m building a utility that leverages the SAS metadata ID (or URI) of a table object. The following code works fine for getting the ID when the library uses the BASE engine:

2条回答
  •  无人共我
    2021-01-24 06:46

    I wrote a macro for this today, located here: https://github.com/sasjs/core/blob/main/meta/mm_gettableid.sas

    Reproduced below:

    /**
      @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;
    

提交回复
热议问题