SAS,以编程方式导出元数据对象 spks

标签 sas sas-metadata

在 SAS 中,我有一个包含大量 SAS 表元数据的文件夹结构。

要从一个环境迁移到另一个环境,我们需要手动创建大量的 spks 并将它们推送到 Git。这是有问题的,因为它 (a) 需要时间,(b) 鼓励开发人员将大量元数据对象打包到一个 .spk 中,这会产生问题,当这些对象中只有一个必须编辑而没有一个可以编辑时被审查。

在那儿:

  • 一种以编程方式导出 .spk 文件的方法?
  • 一种解析文件夹结构并为每个元数据对象创建一个 spk 文件的方法?

  • 如果您能给我指出有用的 SAS 论文或指出正确的方向,那就太好了。

    最佳答案

    你的方法有两点需要指出:

  • 由于嵌入的时间戳,相同的元数据项在导出两次时将具有不同的校验和。这将始终在 GIT 中产生差异。
  • 单独导出每个元数据项需要很长时间——ExportPackage 例程并没有那么快。

  • 但无论如何,你所提议的当然是可以做到的!我刚刚测试了下面的,它工作正常。如果您不在 Windows 上,您可能需要调整 ExportPackage 的路径。管道中的实用程序(使用分号 - ; - 链接命令)..
    %macro exporter(root=%sysfunc(pathname(work)) /* physical root */
        ,host=dev-meta.ACME.int /* metadata server */
        ,port=8561              /* metadata port */
        ,user=sasdemo           /* user with metadata credentials */
        ,pass=Mars123           /* password */
      );
    options noquotelenmax;
    
    data paths (keep=tree_path uri treetype);
      length tree_path $500 uri tree_uri parent_uri 
        parent_name TreeType PublicType $256;
      n=1;
      do while(metadata_getnobj("omsobj:Tree?@PublicType = 'Folder'",n,uri)>0);
      /* code for getting the metadata path */
        rc=metadata_getattr(uri,"Name",tree_path);
        rc=metadata_getattr(uri,"TreeType",TreeType);
        rc=metadata_getattr(uri,"PublicType",PublicType);
        tree_uri=uri;
        do while (metadata_getnasn(tree_uri,"ParentTree",1,parent_uri)>0);
          rc=metadata_getattr(parent_uri,"Name",parent_name);
          tree_path=strip(parent_name)||'/'||strip(tree_path);
          tree_uri=parent_uri;
        end;
        tree_path='/'||strip(tree_path);
        call symputx(cats('path',n),tree_path,'l');
        call symputx(cats('uri',n),uri,'l');
        call symputx('n',n,'l');
        output;
        n+1;
        if n>3 then leave;  /* remove this unless testing */
      end;
    run;
    proc sort; by tree_path;run;
    
    /* get location of BatchExport metadata tool */
    /*http://support.sas.com/documentation/cdl/en/bisag/64088
         /HTML/default/viewer.htm#a003261084.htm*/
    data _null_;
       h="%sysget(SASROOT)";
       h2=substr(h,1,index(h,"SASFoundation")-2);
       call symputx("platform_object_path"
        ,cats(h2,"/SASPlatformObjectFramework/&sysver"));
    run;
    %put Batch tool located at: &platform_object_path;
    
    %let connx_string= -host &host -port &port -user &user -password &pass;
    
    %do x=1 %to &n;
      data out&x (drop=n rc);
        length uri objuri Name PublicType path $256;
        retain path "&&path&x";
        retain uri "&&uri&x";
        n=1;
        do while (metadata_getnasn(uri,'Members',n,objuri)>0);
          rc=metadata_getattr(objuri,"Name",Name);
          rc=metadata_getattr(objuri,"PublicType",PublicType);
          call symputx(cats('objuri',n),objuri,'l');
          call symputx(cats('objName',n),Name,'l');
          call symputx(cats('objType',n),PublicType,'l');
          output;
          n+1;
        end;
      run;
      proc sql noprint;
      select count(*) into: nobs from &syslast;
      %if &nobs=0 %then %do;
        drop table &syslast;
      %end;
      %else %do objn=1 %to &nobs;
        data _null_;
          infile "C: & cd ""&platform_object_path"" %trim(
            ) & ExportPackage &connx_string %trim(
            )-package ""&root&&path&x\&&objType&objn.._&&objname&objn...spk"" %trim(
            )-objects ""&&path&x/&&objname&objn(&&objType&objn)"" %trim(
            )-log ""&root&&path&x\&&objType&objn.._&&objname&objn...log"" 2>&1" 
            pipe lrecl=1000;
          input; 
          list;
        run;
      %end;
    %end;
    %mend;
    
    %exporter()
    

    编辑(2020 年 4 月 11 日)-我在 macrocore 中添加了两个宏库以进一步启用此功能:

    1) mm_spkexport - 将生成导出命令

    2) mmx_spkexport - 将生成命令并执行它(需要 XCMD)

    关于SAS,以编程方式导出元数据对象 spks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32206241/

    相关文章:

    SAS 到预测模型标记语言

    excel - SAS 和 Excel 中百分位数的不同结果

    sas - 阅读上一个和下一个观察结果

    元数据表的 SAS 文件夹路径

    sas - 根据预定义的频率分布随机选择序列中的数字并保存为观察值

    sas - 关于 SAS 中的 "data merge"

    sas - 确定服务器上下文(工作区服务器与存储进程服务器)

    sas - 存储过程的用户,使用哪个变量?

    sas - 从 EG(元数据)获取 SAS VA Report 创建者的姓名