Les données proviennent d'une interrogation du Serveur de Métadonnées SAS (Metadata Server) via PROC METADATA.
1 Bloc de code
DATA STEP
Explication : Calcul et stockage dans une macro-variable des drapeaux (flags) nécessaires à la requête de métadonnées (OMI_SUCCINCT, OMI_GET_METADATA, OMI_ALL_SIMPLE).
Copié !
data _null_;
flags=2048+256+8;
call symputx('flags',flags,'l');
run;
1
DATA _null_;
2
flags=2048+256+8;
3
call symputx('flags',flags,'l');
4
RUN;
2 Bloc de code
PROC METADATA
Explication : Exécution de la requête vers le serveur de métadonnées pour récupérer tous les objets 'SASLibrary'. Le résultat XML est stocké dans la référence de fichier temporaire 'response'.
Copié !
filename response temp;
/* get list of libraries */
proc metadata in=
'<GetMetadataObjects>
<Reposid>$METAREPOSITORY</Reposid>
<Type>SASLibrary</Type>
<Objects/>
<NS>SAS</NS>
<Flags>&flags</Flags>
<Options/>
</GetMetadataObjects>'
out=response;
run;
1
filename response temp;
2
/* get list of libraries */
3
PROC METADATA in=
4
'<GetMetadataObjects>
5
<Reposid>$METAREPOSITORY</Reposid>
6
<Type>SASLibrary</Type>
7
<Objects/>
8
<NS>SAS</NS>
9
<Flags>&flags</Flags>
10
<Options/>
11
</GetMetadataObjects>'
12
out=response;
13
RUN;
3 Bloc de code
DATA STEP
Explication : Étape de débogage qui écrit le contenu brut de la réponse XML dans le journal SAS.
Copié !
/* write the response to the log for debugging */
data _null_;
infile response lrecl=32767;
input;
put _infile_;
run;
1
/* write the response to the log for debugging */
2
DATA _null_;
3
INFILE response lrecl=32767;
4
INPUT;
5
put _infile_;
6
RUN;
4 Bloc de code
DATA STEP
Explication : Génération dynamique d'un fichier SXLEMAP (XML Map) pour définir comment parser le fichier XML retourné et extraire les attributs souhaités (Id, Name, Libref, Engine) sous forme de colonnes.
Copié !
filename sxlemap temp;
data _null_;
file sxlemap;
put '<SXLEMAP version="1.2" name="SASLibrary">';
put '<TABLE name="SASLibrary">';
put '<TABLE-PATH syntax="XPath">//Objects/SASLibrary</TABLE-PATH>';
put '<COLUMN name="LibraryId">><LENGTH>17</LENGTH>';
put '<PATH syntax="XPath">//Objects/SASLibrary/ @Id</PATH></COLUMN>';
put '<COLUMN name="LibraryName"><LENGTH>256</LENGTH>>';
put '<PATH syntax="XPath">//Objects/SASLibrary/ @Name</PATH></COLUMN>';
put '<COLUMN name="LibraryRef"><LENGTH>8</LENGTH>';
put '<PATH syntax="XPath">//Objects/SASLibrary/ @Libref</PATH></COLUMN>';
put '<COLUMN name="Engine">><LENGTH>12</LENGTH>';
put '<PATH syntax="XPath">//Objects/SASLibrary/ @Engine</PATH></COLUMN>';
put '</TABLE></SXLEMAP>';
run;
1
filename sxlemap temp;
2
DATA _null_;
3
file sxlemap;
4
put '<SXLEMAP version="1.2" name="SASLibrary">';
5
put '<TABLE name="SASLibrary">';
6
put '<TABLE-PATH syntax="XPath">//Objects/SASLibrary</TABLE-PATH>';
7
put '<COLUMN name="LibraryId">><LENGTH>17</LENGTH>';
8
put '<PATH syntax="XPath">//Objects/SASLibrary/ @Id</PATH></COLUMN>';
9
put '<COLUMN name="LibraryName"><LENGTH>256</LENGTH>>';
10
put '<PATH syntax="XPath">//Objects/SASLibrary/ @Name</PATH></COLUMN>';
11
put '<COLUMN name="LibraryRef"><LENGTH>8</LENGTH>';
12
put '<PATH syntax="XPath">//Objects/SASLibrary/ @Libref</PATH></COLUMN>';
13
put '<COLUMN name="Engine">><LENGTH>12</LENGTH>';
14
put '<PATH syntax="XPath">//Objects/SASLibrary/ @Engine</PATH></COLUMN>';
15
put '</TABLE></SXLEMAP>';
16
RUN;
5 Bloc de code
PROC SORT Data
Explication : Assignation du moteur XML utilisant le fichier de réponse et la map générée, suivie de la création de la table de sortie triée par nom de bibliothèque.
Copié !
libname _XML_ xml xmlfileref=response xmlmap=sxlemap;
/* sort the response by library name */
proc sort data=_XML_.saslibrary out=&outds;
by libraryname;
run;
1
LIBNAME _XML_ xml xmlfileref=response xmlmap=sxlemap;
2
3
/* sort the response by library name */
4
PROC SORTDATA=_XML_.saslibrary out=&outds;
5
BY libraryname;
6
RUN;
6 Bloc de code
DATA STEP
Explication : Nettoyage de l'environnement en libérant les références de fichiers (filename) et de bibliothèque (libname).
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
« Ce programme illustre une méthode de "bas niveau" extrêmement efficace pour interroger le serveur de métadonnées SAS 9 (OMR). Contrairement aux fonctions d'interface classiques, l'utilisation de PROC METADATA combinée à un moteur XML Mapper permet d'extraire des volumes importants d'informations structurelles en une seule requête réseau, optimisant ainsi les performances lors de l'audit de plateformes complexes.
Recommandations et points de vigilance
La logique des Flags : Le calcul initial (2048+256+8) est crucial. Ces drapeaux indiquent au serveur d'inclure les objets du dépôt courant, de traiter la requête de manière synchrone et de formater la sortie XML. Une erreur dans ces bits peut entraîner une réponse incomplète ou un XML illisible par le moteur SXLEMAP.
Agilité du XML Mapping : La création dynamique du fichier sxlemap est une pratique d'expert. Elle permet d'isoler uniquement les attributs dont vous avez besoin (Id, Name, Libref, Engine) via des expressions XPath. Cela transforme une réponse XML potentiellement verbeuse en une table SAS propre et immédiatement exploitable pour du reporting.
Limites de contexte : Ce code est conçu pour l'architecture Open Metadata Architecture (OMA) de SAS 9. Bien que la compatibilité descendante puisse exister, il est inopérant pour lister les caslibs natives de SAS Viya. Pour Viya, il est préférable d'utiliser l'instruction CASLIB _ALL_ LIST ou d'interroger les API REST via la PROC HTTP. »
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.