No simple or direct solution here. At least that I'm aware of.
Beside reading from dictionary tables, and assuming that all the tables are in the same library, you could also gather info about library contents with the CONTENTS procedure, say, something like this:
proc contents data = LIB._ALL_ out = WORK.CONTENTS noprint;
run;
From there you need to work the CONTENTS table, which will hold pretty much all the metainfo about each table found in LIB.
Do a select distinct over the MEMNAME variable (table name) where MEMTYPE = 'DATA' (only dataset members) and you'll get every dataset name in LIB.
From there, you just need the right names into some macro variable (maybe a select into: will do the job here) and concatenate the desired dataset into a single one.
After that, I would sugest to move (to anotther lib) or rename the concatenated dataset, so they won't be concatenated again on the next run (or you could work with the last modified date of each, more work here).
As you see, not very easy.
Good work!
Cheers from Portugal.
Daniel Santos @
www.cgd.pt.