SAS,以编程方式导出元数据对象 spks
SAS, programmatically export metadata object spks
在 SAS 中,我有一个包含大量 SAS table 元数据的文件夹结构。
要从一个环境迁移到另一个环境,我们需要手动创建大量spks并将它们推送到Git。这是有问题的,因为它 (a) 需要时间,(b) 开发人员被激励将大量元数据对象打包到一个 .spk 中,这会产生问题,当只有一个对象必须被编辑并且 none可以审核。
是否有:
- 以编程方式导出 .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 0 uri tree_uri parent_uri
parent_name TreeType PublicType 6;
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 6;
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 库中添加了两个宏以进一步启用此功能:
mm_spkexport - 将生成导出命令
mmx_spkexport - 将生成命令并执行它(需要 XCMD)
在 SAS 中,我有一个包含大量 SAS table 元数据的文件夹结构。
要从一个环境迁移到另一个环境,我们需要手动创建大量spks并将它们推送到Git。这是有问题的,因为它 (a) 需要时间,(b) 开发人员被激励将大量元数据对象打包到一个 .spk 中,这会产生问题,当只有一个对象必须被编辑并且 none可以审核。
是否有:
- 以编程方式导出 .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 0 uri tree_uri parent_uri
parent_name TreeType PublicType 6;
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 6;
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 库中添加了两个宏以进一步启用此功能:
mm_spkexport - 将生成导出命令
mmx_spkexport - 将生成命令并执行它(需要 XCMD)