Harnessing the Power of CALL EXECUTE in SAS for Dynamic Code Execution
Harnessing the Power of CALL EXECUTE in SAS for Dynamic Code Execution
As SAS programmers, we often encounter situations where we need to execute a certain procedure or set of steps multiple times, typically based on different subsets of data. Manually writing out code for each instance can be time-consuming, but SAS offers a powerful tool to make this process more efficient: CALL EXECUTE.
What is CALL EXECUTE?
CALL EXECUTE is a SAS routine that allows you to dynamically generate and execute SAS code during a data step’s execution. Instead of hardcoding the logic for every individual case, CALL EXECUTE can generate the code on the fly and execute it as part of the same data step. This technique is invaluable when you have repetitive tasks across different datasets, procedures, or even report generation.
Basic Example: Dynamic PROC PRINT Execution
Let's say you have multiple datasets in the WORK library, and you want to run a PROC PRINT for each dataset. Instead of manually writing a PROC PRINT for each one, you can use CALL EXECUTE to automate this process:
proc sql;
select cat('proc print data=', libname, '.', memname, '; run;')
into :code_list separated by ' '
from sashelp.vtable
where libname='WORK';
quit;
data _null_;
call execute("&code_list");
run;
This code does the following:
- The
PROC SQLstep queries the SAS dictionary tablesashelp.vtableto generate a list of all datasets in the WORK library. It concatenates each dataset name into aPROC PRINTstatement and stores them in the macro variablecode_list. - The
CALL EXECUTEroutine inside theDATA _NULL_step dynamically executes eachPROC PRINTstatement, printing each dataset without manual intervention.
Benefits of Using CALL EXECUTE
The ability to dynamically generate and execute code gives you tremendous flexibility. Here are some key benefits:
- Automated Task Execution: Use
CALL EXECUTEto run procedures on multiple datasets, making automation easier in iterative tasks like generating reports. - Reduced Code Duplication: Eliminate the need to manually write out repetitive code, making your programs cleaner and more maintainable.
- Increased Flexibility: Dynamically adjust the logic based on changing data or parameters without modifying the core program.
Advanced Example: Conditional Execution of Procedures
In some cases, you might want to execute different procedures based on the content of the data. Here's an example where we execute PROC FREQ if a dataset contains a categorical variable, and PROC MEANS if it contains a numeric variable:
data _null_;
set sashelp.vcolumn(where=(libname='WORK'));
if type = 'char' then
call execute('proc freq data=work.' || trim(memname) || '; tables ' || name || '; run;');
else if type = 'num' then
call execute('proc means data=work.' || trim(memname) || '; var ' || name || '; run;');
run;
In this code:
- The
sashelp.vcolumntable provides information about the columns in each dataset, including the variable type (character or numeric). - Depending on the variable type,
CALL EXECUTEruns eitherPROC FREQfor categorical data orPROC MEANSfor numeric data.
Conclusion
Using CALL EXECUTE in SAS is an efficient way to dynamically generate and execute code, particularly in situations that involve repetitive tasks. Whether you’re working on large datasets or need to run different procedures conditionally, CALL EXECUTE can significantly simplify your workflow and reduce manual intervention. Mastering this tool will help make your SAS programming more efficient and flexible.
Have you used CALL EXECUTE in your SAS programs? Share your experiences in the comments below!