L'accès aux métadonnées via la vue SASHELP.VTABLE combiné à l'instruction %SYSCALL SET représente le summum de l'efficacité pour le pilotage dynamique de flux SAS. Contrairement à une étape DATA classique qui créerait une table physique intermédiaire, cette macro utilise les fonctions d'ouverture de bas niveau (%sysfunc(open)) pour mapper directement les colonnes du dictionnaire SAS vers des variables macro. C'est une technique d'expert indispensable pour l'automatisation, permettant par exemple de vérifier le nombre d'observations (_nobs) ou la date de modification (_modate) avant de décider de lancer un traitement lourd.
La subtilité technique ici réside dans l'utilisation de %SYSCALL SET(dsid). Cette commande lie automatiquement les variables macro locales aux colonnes de la vue ouverte ; dès que %sysfunc(fetchobs) est exécuté, toutes les métadonnées de la table ciblée sont instantanément chargées dans les variables correspondantes sans aucune extraction manuelle. C'est une méthode extrêmement propre qui minimise les ressources CPU et mémoire, tout en offrant une traçabilité parfaite grâce aux journaux (%put) générés.
Une astuce d'expert pour optimiser ce code : puisque vous utilisez des variables globales pour stocker les résultats finaux, assurez-vous de toujours vérifier que le descripteur dsid est différent de zéro. Si la table n'existe pas, dsid vaudra 0 et les fonctions suivantes échoueront. Ajouter un test conditionnel sur la valeur de retour de open rendra votre macro totalement robuste pour un environnement de production.
Type : SASHELP
La macro interroge la vue système `sashelp.vtable` pour obtenir les métadonnées de la table demandée par l'utilisateur. Elle ne crée pas de données et ne lit pas de fichiers externes directement.
| 1 | %macro utl_getTable(lib,dsn) |
| 2 | /des="get table attributes meta data"; |
| 3 | /*--- OUTPUT MACRO VARIABLES |
| 4 | _LIBNAME |
| 5 | _MEMNAME |
| 6 | _MEMTYPE |
| 7 | _MEMLABEL |
| 8 | _TYPEMEM |
| 9 | _CRDATE |
| 10 | _MODATE |
| 11 | _NOBS |
| 12 | _OBSLEN |
| 13 | _NVAR |
| 14 | _FILESIZE |
| 15 | _DELOBS |
| 16 | _NLOBS |
| 17 | _NUM_CHARACTER |
| 18 | _NUM_NUMERIC |
| 19 | ---*/ |
| 20 | /*--- for testing withou macro |
| 21 | %let lib=sashelp; |
| 22 | %let dsn=class; |
| 23 | ---*/ |
| 24 | %global |
| 25 | _libname |
| 26 | _memname |
| 27 | _memtype |
| 28 | _memlabel |
| 29 | _typemem |
| 30 | _crdate |
| 31 | _modate |
| 32 | _nobs |
| 33 | _obslen |
| 34 | _nvar |
| 35 | _filesize |
| 36 | _delobs |
| 37 | _nlobs |
| 38 | _num_character |
| 39 | _num_numeric ; |
| 40 | %local |
| 41 | LIBNAME |
| 42 | memname |
| 43 | memtype |
| 44 | memlabel |
| 45 | typemem |
| 46 | crdate |
| 47 | modate |
| 48 | nobs |
| 49 | obslen |
| 50 | nvar |
| 51 | filesize |
| 52 | delobs |
| 53 | nlobs |
| 54 | num_character |
| 55 | num_numeric ; |
| 56 | |
| 57 | %let dsid=%sysfunc(open(sashelp.vtable |
| 58 | (where=( |
| 59 | upcase("&lib") = upcase(LIBNAME) |
| 60 | and upcase("&dsn") = memname)),i)); |
| 61 | |
| 62 | %syscall SET(dsid); |
| 63 | |
| 64 | %let rc=%sysfunc(fetchobs(&dsid,1)); |
| 65 | %let rc=%sysfunc(close(&dsid)); |
| 66 | |
| 67 | %let _libname = %qtrim(&LIBNAME ); |
| 68 | %let _memname = %qtrim(&memname ); |
| 69 | %let _memtype = %qtrim(&memtype ); |
| 70 | %let _memlabel = %qtrim(&memlabel ); |
| 71 | %let _typemem = %qtrim(&typemem ); |
| 72 | %let _crdate = %qtrim(&crdate ); |
| 73 | %let _modate = %qtrim(&modate ); |
| 74 | %let _nobs = %qtrim(&nobs ); |
| 75 | %let _obslen = %qtrim(&obslen ); |
| 76 | %let _nvar = %qtrim(&nvar ); |
| 77 | %let _filesize = %qtrim(&filesize ); |
| 78 | %let _delobs = %qtrim(&delobs ); |
| 79 | %let _nlobs = %qtrim(&nlobs ); |
| 80 | %let _num_character = %qtrim(&num_character); |
| 81 | %let _num_numeric = %qtrim(&num_numeric ); |
| 82 | |
| 83 | %put ---- inside &=_libname ; |
| 84 | %put ---- inside &=_memname ; |
| 85 | %put ---- inside &=_memtype ; |
| 86 | %put ---- inside &=_memlabel ; |
| 87 | %put ---- inside &=_typemem ; |
| 88 | %put ---- inside &=_crdate ; |
| 89 | %put ---- inside &=_modate ; |
| 90 | %put ---- inside &=_nobs ; |
| 91 | %put ---- inside &=_obslen ; |
| 92 | %put ---- inside &=_nvar ; |
| 93 | %put ---- inside &=_filesize ; |
| 94 | %put ---- inside &=_delobs ; |
| 95 | %put ---- inside &=_nlobs ; |
| 96 | %put ---- inside &=_num_character; |
| 97 | %put ---- inside &=_num_numeric ; |
| 98 | %mend utl_getTable; |