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 SQL
step queries the SAS dictionary tablesashelp.vtable
to generate a list of all datasets in the WORK library. It concatenates each dataset name into aPROC PRINT
statement and stores them in the macro variablecode_list
. - The
CALL EXECUTE
routine inside theDATA _NULL_
step dynamically executes eachPROC PRINT
statement, 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 EXECUTE
to 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.vcolumn
table provides information about the columns in each dataset, including the variable type (character or numeric). - Depending on the variable type,
CALL EXECUTE
runs eitherPROC FREQ
for categorical data orPROC MEANS
for 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!