2014-02-04 7 views
0

Я хочу перечислить все таблицы на сервере метаданных. Я пробовал со следующим шагом данных, но он только рисует одну таблицу в библиотеке, и я не могу понять, почему.Получение таблиц, расположенных на сервере метаданных с помощью SAS

Это код, который я использую:

options metaserver="xxxx" 
    metaport=8561 
    metauser="xxxx" 
    metapass="xxxx" 
    METAPROTOCOL=BRIDGE 
    metarepository="Foundation"; 


data meta_libraries; 
    length uri serveruri conn_uri domainuri libname ServerContext AuthDomain path_schema 
     usingpkguri type tableuri coluri $256 id $17 
     desc $200 libref engine $8 isDBMS $1 table colname coltype collen $32; 
    keep libname desc libref engine ServerContext path_schema AuthDomain table colname coltype collen 
     IsPreassigned IsDBMSLibname id; 
    nobj=.; 
    n=1; 
    uri=''; 
    serveruri=''; 
    conn_uri=''; 
    domainuri=''; 

     /***Determine how many libraries there are***/ 
    nobj=metadata_getnobj("omsobj:[email protected] contains '.'",n,uri); 
     /***Retrieve the attributes for all libraries, if there are any***/ 
    if n>0 then do n=1 to nobj; 
    libname=''; 
    ServerContext=''; 
    AuthDomain=''; 
    desc=''; 
    libref=''; 
    engine=''; 
    isDBMS=''; 
    IsPreassigned=''; 
    IsDBMSLibname=''; 
    path_schema=''; 
    usingpkguri=''; 
    type=''; 
    id=''; 
    nobj=metadata_getnobj("omsobj:[email protected] contains '.'",n,uri); 
    rc= metadata_getattr(uri, "Name", libname); 
    rc= metadata_getattr(uri, "Desc", desc); 
    rc= metadata_getattr(uri, "Libref", libref); 
    rc= metadata_getattr(uri, "Engine", engine); 
    /*rc= metadata_getattr(uri, "IsDBMSLibname", isDBMS);*/ 
    rc= metadata_getattr(uri, "IsDBMSLibname", IsDBMSLibname); 
    rc= metadata_getattr(uri, "IsPreassigned", IsPreassigned); 
    rc= metadata_getattr(uri, "Id", Id); 

     /*** Get associated ServerContext ***/ 
    i=1; 
    rc= metadata_getnasn(uri, "DeployedComponents", i, serveruri); 
    if rc > 0 then rc2= metadata_getattr(serveruri, "Name", ServerContext); 
    else ServerContext=''; 

     /*** If the library is a DBMS library, get the Authentication Domain 
      associated with the DBMS connection credentials ***/ 
    if isDBMS="1" then do; 
     i=1; 
     rc= metadata_getnasn(uri, "LibraryConnection", i, conn_uri); 
     if rc > 0 then do; 
      rc2= metadata_getnasn(conn_uri, "Domain", i, domainuri); 
      if rc2 > 0 then rc3= metadata_getattr(domainuri, "Name", AuthDomain); 
     end; 
    end; 

     /*** Get the path/database schema for this library ***/ 
    rc=metadata_getnasn(uri, "UsingPackages", 1, usingpkguri); 
    if rc>0 then do; 
     rc=metadata_resolve(usingpkguri,type,id); 
     if type='Directory' then rc=metadata_getattr(usingpkguri, "DirectoryName", path_schema); 
     else if type='DatabaseSchema' then rc=metadata_getattr(usingpkguri, "Name", path_schema); 
     else path_schema="unknown"; 
    end; 

     /*** Get the tables associated with this library ***/ 
     /*** If DBMS, tables are associated with DatabaseSchema ***/ 
    if type='DatabaseSchema' then do; 
     t=1; 
     ntab=metadata_getnasn(usingpkguri, "Tables", t, tableuri); 
     if ntab>0 then do t=1 to ntab; 
      tableuri=''; 
      table=''; 
      ntab=metadata_getnasn(usingpkguri, "Tables", t, tableuri); 
      tabrc= metadata_getattr(tableuri, "Name", table); 

       output; 
       end; 
       else do; 
       put 'Library ' libname ' has no tables registered'; 
       output; 
       end; 

     end; 

    end; 
    else if type='Directory' then do; 
     t=1; 
     ntab=metadata_getnasn(uri, "Tables", t, tableuri); 
     if ntab>0 then do t=1 to ntab; 
      tableuri=''; 
      table=''; 
      ntab=metadata_getnasn(uri, "Tables", t, tableuri); 
      tabrc= metadata_getattr(tableuri, "Name", table); 
      output; 
     end; 
     else put 'Library ' libname ' has no tables registered'; 

    end; 

     /***If there aren't any libraries, write a message to the log***/ 
    else put 'There are no libraries defined in this metadata repository.'; 
run; 

Я был бы признателен, если кто-то имеет какие-либо предложения?

ответ

2

Я бы рекомендовал использовать «proc metadata» вместо функций шага данных.

Это возможное решение, хотя оно может быть улучшено, поскольку оно приносит больше информации, чем нужно.

options metaport  = &metaport 
     metaserver  = "&metaserver" 
     metarepository = "Foundation" 
     metauser  = &meta_user. 
     metapass  = "&meta_pass"; 


* use a temporary fileref to hold the request; 
filename request temp; 

* use a data step to create the XML request; 
data _null_; 
    file request; 
    put '<GetMetadataObjects>'; 
    put ' <Reposid>$METAREPOSITORY</Reposid>'; 
    put ' <Type>PhysicalTable</Type>'; 
    put ' <Objects />'; 
    put ' <NS>SAS</NS>'; 
    * Flags: <!-- OMI_ALL(1) + OMI_GET_METADATA(256) + OMI_TEMPLATE (4)+ OMI_SUCCINT (2048) = 2309 -->; 
    put ' <Flags>2309</Flags>'; 
    put '<Options>'; 
    put ' <Templates>'; 
    put '  <PhysicalTable/>'; 
    put '  <SASLibrary Engine="" Libref=""/>'; 
    put ' </Templates>';  
    put ' </Options>'; 
    put '</GetMetadataObjects>'; 
run; 


* use a temporary fileref to hold the response; 
filename response TEMP; *"%sysfunc(getoption(work))/response.xml"; 

proc metadata in=request out=response verbose; 
run; 

* release the temporary request; 
filename request; 

filename mapa temp; 

data _null_; 
    file mapa; 
    put '<?xml version="1.0" encoding="windows-1252"?>'; 
    put '<!-- ############################################################ -->'; 
    put '<!-- 2014-02-05T15:41:54 -->'; 
    put '<!-- SAS XML Libname Engine Map -->'; 
    put '<!-- Generated by XML Mapper, 903200.3.0.20120523190000_v930m2 -->'; 
    put '<!-- ############################################################ -->'; 
    put '<SXLEMAP name="AUTO_GEN" version="2.1">'; 

    put ' <NAMESPACES count="0"/>'; 

    put ' <!-- ############################################################ -->'; 
    put ' <TABLE description="SASLibrary" name="SASLibrary">'; 
    put '  <TABLE-PATH syntax="XPath">/GetMetadataObjects/Objects/PhysicalTable/TablePackage/SASLibrary</TABLE-PATH>'; 

    put '  <COLUMN name="LibId">'; 
    put '   <PATH syntax="XPath">/GetMetadataObjects/Objects/PhysicalTable/TablePackage/SASLibrary/@Id</PATH>'; 
    put '   <TYPE>character</TYPE>'; 
    put '   <DATATYPE>string</DATATYPE>'; 
    put '   <LENGTH>17</LENGTH>'; 
    put '  </COLUMN>'; 

    put '  <COLUMN name="Engine">'; 
    put '   <PATH syntax="XPath">/GetMetadataObjects/Objects/PhysicalTable/TablePackage/SASLibrary/@Engine</PATH>'; 
    put '   <TYPE>character</TYPE>'; 
    put '   <DATATYPE>string</DATATYPE>'; 
    put '   <LENGTH>4</LENGTH>'; 
    put '  </COLUMN>'; 

    put '  <COLUMN name="Libref">'; 
    put '   <PATH syntax="XPath">/GetMetadataObjects/Objects/PhysicalTable/TablePackage/SASLibrary/@Libref</PATH>'; 
    put '   <TYPE>character</TYPE>'; 
    put '   <DATATYPE>string</DATATYPE>'; 
    put '   <LENGTH>8</LENGTH>'; 
    put '  </COLUMN>'; 

    put '  <COLUMN name="TabID" retain="YES">'; 
    put '   <PATH syntax="XPath">/GetMetadataObjects/Objects/PhysicalTable/@Id</PATH>'; 
    put '   <TYPE>character</TYPE>'; 
    put '   <DATATYPE>string</DATATYPE>'; 
    put '   <LENGTH>17</LENGTH>'; 
    put '  </COLUMN>'; 

    put '  <COLUMN name="Name_Table" retain="YES">'; 
    put '   <PATH syntax="XPath">/GetMetadataObjects/Objects/PhysicalTable/@Name</PATH>'; 
    put '   <TYPE>character</TYPE>'; 
    put '   <DATATYPE>string</DATATYPE>'; 
    put '   <LENGTH>32</LENGTH>'; 
    put '  </COLUMN>'; 

    put '  <COLUMN name="SASTableName" retain="YES">'; 
    put '   <PATH syntax="XPath">/GetMetadataObjects/Objects/PhysicalTable/@SASTableName</PATH>'; 
    put '   <TYPE>character</TYPE>'; 
    put '   <DATATYPE>string</DATATYPE>'; 
    put '   <LENGTH>32</LENGTH>'; 
    put '  </COLUMN>'; 

    put '  <COLUMN name="TableName" retain="YES">'; 
    put '   <PATH syntax="XPath">/GetMetadataObjects/Objects/PhysicalTable/@TableName</PATH>'; 
    put '   <TYPE>character</TYPE>'; 
    put '   <DATATYPE>string</DATATYPE>'; 
    put '   <LENGTH>32</LENGTH>'; 
    put '  </COLUMN>'; 

    put ' </TABLE>'; 

    put '</SXLEMAP>'; 
run; 


libname fim xmlv2 xmlfileref=response xmlmap=MAPA access=READONLY; 

/* 
* Local Extraction 
*/ 

DATA SASLibrary; SET fim.SASLibrary; run; 

* release the temporary file and libname; 
filename response clear; 
libname fim clear; 
+0

Этот код не работает для меня. У нас есть SAS 9.2 в моей компании, а xmlv2 - в 9.3. Я попытался использовать XML92 вместо этого, но затем я получаю сообщение об ошибке, что xmlmap неправильно сформирован. Ты знаешь почему? – user3270069

+1

Извините за задержку в ответе, но я только заметил, что вы задали вопрос сегодня. Эти ошибки, как правило, связаны с изменением типа данных определения столбца xmlmap (тот, который был представлен выше, был автоматически сгенерирован «преобразователем XML SAS», и поскольку он работал, я не уделял слишком много внимания параметрам на каждом из определения). Я бы предложил вам отладить код, комментируя и раскомментируя операторы put, которые пишут каждый столбец xmlmap. Надеюсь, это поможет. – user3110787

+0

Это только возвращает таблицы, зарегистрированные в библиотеках, которые используют BASE-движок. Это не приведет к возврату таблиц в другие типы файлов библиотеки, например ODBC или OLEDB. –

0

Ваша else if type='Directory' then do; линия была за пределами необходимой do; end; группы.

Кроме этого, ваш код работает нормально! Смотри ниже.

data meta_libraries; 
    length uri serveruri conn_uri domainuri libname ServerContext AuthDomain path_schema 
     usingpkguri type tableuri coluri $256 id $17 
     desc $200 libref engine $8 isDBMS $1 table colname coltype collen $32; 
    keep libname desc libref engine ServerContext path_schema AuthDomain table colname 
     coltype collen IsPreassigned IsDBMSLibname id; 
    nobj=.; 
    n=1; 
    uri=''; 
    serveruri=''; 
    conn_uri=''; 
    domainuri=''; 

     /***Determine how many libraries there are***/ 
    nobj=metadata_getnobj("omsobj:[email protected] contains '.'",n,uri); 
     /***Retrieve the attributes for all libraries, if there are any***/ 
    if n>0 then do n=1 to nobj; 
    libname=''; 
    ServerContext=''; 
    AuthDomain=''; 
    desc=''; 
    libref=''; 
    engine=''; 
    isDBMS=''; 
    IsPreassigned=''; 
    IsDBMSLibname=''; 
    path_schema=''; 
    usingpkguri=''; 
    type=''; 
    id=''; 
    nobj=metadata_getnobj("omsobj:[email protected] contains '.'",n,uri); 
    rc= metadata_getattr(uri, "Name", libname); 
    rc= metadata_getattr(uri, "Desc", desc); 
    rc= metadata_getattr(uri, "Libref", libref); 
    rc= metadata_getattr(uri, "Engine", engine); 
    rc= metadata_getattr(uri, "IsDBMSLibname", isDBMS); 
    rc= metadata_getattr(uri, "IsDBMSLibname", IsDBMSLibname); 
    rc= metadata_getattr(uri, "IsPreassigned", IsPreassigned); 
    rc= metadata_getattr(uri, "Id", Id); 

    /*** Get associated ServerContext ***/ 
    i=1; 
    rc= metadata_getnasn(uri, "DeployedComponents", i, serveruri); 
    if rc > 0 then rc2= metadata_getattr(serveruri, "Name", ServerContext); 
    else ServerContext=''; 

    /*** If the library is a DBMS library, get the Authentication Domain 
     associated with the DBMS connection credentials ***/ 
    if isDBMS="1" then do; 
     i=1; 
     rc= metadata_getnasn(uri, "LibraryConnection", i, conn_uri); 
     if rc > 0 then do; 
     rc2= metadata_getnasn(conn_uri, "Domain", i, domainuri); 
     if rc2 > 0 then rc3= metadata_getattr(domainuri, "Name", AuthDomain); 
     end; 
    end; 

    /*** Get the path/database schema for this library ***/ 
    rc=metadata_getnasn(uri, "UsingPackages", 1, usingpkguri); 
    if rc>0 then do; 
     rc=metadata_resolve(usingpkguri,type,id); 
     if type='Directory' then 
     rc=metadata_getattr(usingpkguri, "DirectoryName", path_schema); 
     else if type='DatabaseSchema' then 
     rc=metadata_getattr(usingpkguri, "Name", path_schema); 
     else path_schema="unknown"; 
    end; 

    /*** Get the tables associated with this library ***/ 
    /*** If DBMS, tables are associated with DatabaseSchema ***/ 
    if type='DatabaseSchema' then do; 
     t=1; 
     ntab=metadata_getnasn(usingpkguri, "Tables", t, tableuri); 
     if ntab>0 then do t=1 to ntab; 
     tableuri=''; 
     table=''; 
     ntab=metadata_getnasn(usingpkguri, "Tables", t, tableuri); 
     tabrc= metadata_getattr(tableuri, "Name", table); 
     output; 
     end; 
     else do; 
     put 'Library ' libname ' has no tables registered'; 
     output; 
     end; 
    end; 
    else if type='Directory' then do; 
     t=1; 
     ntab=metadata_getnasn(uri, "Tables", t, tableuri); 
     if ntab>0 then do t=1 to ntab; 
     tableuri=''; 
     table=''; 
     ntab=metadata_getnasn(uri, "Tables", t, tableuri); 
     tabrc= metadata_getattr(tableuri, "Name", table); 
     output; 
     end; 
     else put 'Library ' libname ' has no tables registered'; 
    end; 
    end; 
    /***If there aren't any libraries, write a message to the log***/ 
    else put 'There are no libraries defined in this metadata repository.'; 
run; 

proc sort; by libref table;run; 

 Смежные вопросы

  • Нет связанных вопросов^_^