以编程方式在元数据中注册SAS库
我正在编写一个部署脚本,并希望以编程方式在元数据中注册一个简单(且为空)的基本库,如下面的库以编程方式在元数据中注册SAS库,sas,sas-metadata,Sas,Sas Metadata,我正在编写一个部署脚本,并希望以编程方式在元数据中注册一个简单(且为空)的基本库,如下面的库 libname MYLIB 'C:\temp'; 可以找到示例XML语法。。我只是不知道如何将其与proc元数据结合起来执行更新(例如元数据ID是如何生成的?@user2173800您是否收到过上述问题的解决方案? 以下是我的想法: 下面的代码在元数据下创建了一个名为BASE\u Metalib的SAS库 文件夹:/Shared Data/Libraries/BASE_Metalib(假定此文件夹已存
libname MYLIB 'C:\temp';
可以找到示例XML语法。。我只是不知道如何将其与proc元数据结合起来执行更新(例如元数据ID是如何生成的?@user2173800您是否收到过上述问题的解决方案? 以下是我的想法: 下面的代码在元数据下创建了一个名为BASE\u Metalib的SAS库 文件夹:/Shared Data/Libraries/BASE_Metalib(假定此文件夹已存在于元数据中)。该代码还将重新注册为此库定义的此目录下的所有表。下面的代码使用Metadata Datastep函数与元数据进行接口
/*Creating a Metadata Library with BASE Engine and register all the tables under it */
options metaserver="taasasf2"
metaport=8561
metauser="testuser"
metapass="test123"
metarepository="Foundation";
%Let MetaLibName=BASE_Metalib; /* Name of the SAS Library with BASE Engine to be created */
data _null_;
length luri uri muri $256;
rc=0;
Call missing(luri,uri,muri);
/* Create a SASLibrary object in the Shared Data folder. */
rc=metadata_newobj("SASLibrary",
luri,
"&MetaLibname.",
"Foundation",
"omsobj:Tree?@Name=%bquote('&Metalibname.')",
"Members");
put rc=;
put luri=;
/* Add PublicType,UsageVersion,Engine,Libref,IsDBMSLibname attribute values. */
rc=metadata_setattr(luri,
"PublicType",
"Library");
put rc=;
put luri=;
rc=metadata_setattr(luri,
"UsageVersion",
"1000000.0");
put rc=;
put luri=;
rc=metadata_setattr(luri,
"Engine",
"BASE");
put rc=;
put luri=;
rc=metadata_setattr(luri,
"Libref",
"SASTEST");
put rc=;
put luri=;
rc=metadata_setattr(luri,
"IsDBMSLibname",
"0");
put rc=;
put luri=;
/* Set Directory Object via UsingPackages Association for the SAS Library Object */
rc=metadata_newobj("Directory",
uri,
"");
put uri=;
rc=metadata_setassn(luri,
"UsingPackages",
"Replace",
uri);
put rc=;
rc=metadata_setattr(uri,"DirectoryName","/shrproj/files/ANA_AR2_UWCRQ/data");
put rc=;
/* Set Server Context Object via DeployedComponents Association for the SAS Library Object */
rc=metadata_getnobj("omsobj:ServerContext?@Name='SASApp'",1,muri);
put muri=;
rc=metadata_setassn(luri,
"DeployedComponents",
"Append",
muri);
put rc=;
Run;
proc metalib;
omr (library="&Metalibname.");
report;
run;
我终于明白了——有几件事要考虑! 1) 确保所有必需的对象都存在(以避免孤立元数据数据) 2) 检查以确保已成功创建对象 3) 检查以避免两次创建库(幂等) 4) 一般倾向于避免数据步骤元数据函数和相应的无限循环风险 程序的XML部分如下所示:
/**
* Prepare the XML and create the library
*/
data _null_;
file &frefin;
treeuri=quote(symget('treeuri'));
serveruri=quote(symget('serveruri'));
directoryuri=quote(symget('directoryuri'));
libname=quote(symget('libname'));
libref=quote(symget('libref'));
IsPreassigned=quote(symget('IsPreassigned'));
prototypeuri=quote(symget('prototypeuri'));
/* escape description so it can be stored as XML */
libdesc=tranwrd(symget('libdesc'),'&','&');
libdesc=tranwrd(libdesc,'<','<');
libdesc=tranwrd(libdesc,'>','>');
libdesc=tranwrd(libdesc,"'",''');
libdesc=tranwrd(libdesc,'"','"');
libdesc=tranwrd(libdesc,'0A'x,' ');
libdesc=tranwrd(libdesc,'0D'x,' ');
libdesc=quote(trim(libdesc));
put "<AddMetadata><Reposid>$METAREPOSITORY</Reposid><Metadata> "/
'<SASLibrary Desc=' libdesc ' Engine="BASE" IsDBMSLibname="0" '/
' IsHidden="0" IsPreassigned=' IsPreassigned ' Libref=' libref /
' UsageVersion="1000000" PublicType="Library" name=' libname '>'/
' <DeployedComponents>'/
' <ServerContext ObjRef=' serveruri "/>"/
' </DeployedComponents>'/
' <PropertySets>'/
' <PropertySet Name="ModifiedByProductPropertySet" '/
' SetRole="ModifiedByProductPropertySet" UsageVersion="0" />'/
' </PropertySets>'/
" <Trees><Tree ObjRef=" treeuri "/></Trees>"/
' <UsingPackages> '/
' <Directory ObjRef=' directoryuri ' />'/
' </UsingPackages>'/
' <UsingPrototype>'/
' <Prototype ObjRef=' prototypeuri '/>'/
' </UsingPrototype>'/
'</SASLibrary></Metadata><NS>SAS</NS>'/
'<Flags>268435456</Flags></AddMetadata>';
run;
/**
*准备XML并创建库
*/
数据为空;
文件&frefin;
treeuri=quote(symget('treeuri'));
serveruri=quote(symget('serveruri');
directoryuri=quote(symget('directoryuri'));
libname=quote(symget('libname'));
libref=quote(symget('libref'));
IsPreassigned=quote(symget('IsPreassigned'));
prototypeuri=quote(symget('prototypeuri');
/*转义描述,以便将其存储为XML*/
libdesc=tranwrd(symget('libdesc')、'&','&;');
libdesc=tranwrd(libdesc,,'');
libdesc=tranwrd(libdesc,“,”&apos;);
libdesc=tranwrd(libdesc,“,”);
libdesc=tranwrd(libdesc,'0A'x',
;');
libdesc=tranwrd(libdesc,'0D'x',
;');
libdesc=报价(trim(libdesc));
放”