SAS Macro does not permit DATALINES, nor even PARMCARDS - they don't survive macro compilation.
However, thanks to a SAS-L post by Richard DeVenezia it was discovered that you CAN create datasets using SAS Macro using a 'trick' in the compilation process!
TLDR;
- stick your datalines UNDERNEATH the macro definition and it will run during compilation. If your definition deletes itself, then it will compile each time :-)
Full code:
/**
* setup temporary autocall location
* - yours may be permanent
*/
%let loc=%sysfunc(pathname(work))/myloc;
options dlcreatedir;
libname _ "&loc";
libname _ clear;
options insert=(sasautos=("&loc"));
/**
* put a macro there
* - yours can be written directly
*/
filename FT15F001 "&loc/richardyoulegend.sas";
parmcards4;
%macro richardyoulegend();
proc catalog catalog=work.sasmac1;
delete richardyoulegend.macro;
quit /* NOTE - missing semicolon */
%mend;
/**
* put your datalines here!
* - they will execute on compilation
*/
data _data_; /* DATA1 / DATA2 / DATA3 */
input name $ age $;
datalines;
John 42
Mary 104
;
run;
;;;;
You can now call your macro multiple times, to create multiple datasets! NOTE - you will need to include the semicolon to trigger the macro deletion OUTSIDE the macro.
%richardyoulegend();
%richardyoulegend();
%richardyoulegend();