BookmarkSubscribeRSS Feed
Mike_Davis
Fluorite | Level 6

Hello everyone,

why It will cause an error in the first data step while the second data step is ok?

Thanks!

Mike

data _null_;
set sashelp.class;
call execute('%global zzz'name';');
run;
%put _user_;

data _null_;
set sashelp.class;
call execute('%global zzz'||name||';');
run;
%put _user_;

2 REPLIES 2
Quentin
Super User

Hi,

The argument for CALL EXECUTE is a character expression.

In SAS, when you want to build a character expression from text literals and variable values, you use the concatenation operator ( || ) or concatenation functions.

So your first example fails for the same reason that the below fails:

data _null_;
  set sashelp.class;
  a='%global zzz'name';'; 
  put a=;
run;

And below succeeds:

data _null_;
  set sashelp.class;
  a='%global zzz'||name||';';
  put a=;
run;

Does that help?

--Q.

FriedEgg
SAS Employee

Quentin has provided the answer.  Your first method does not create a valid character expression, so it fails.  The being said, when calling macro statements in a data step with call execute I prefer to wrap them with %nrstr so that they will run sequentially after the datastep completes instead of in place.  This is not always important but I find it to be a good practice to follow:

data _null_;

set sashelp.class;

call execute('%nrstr(%global zzz' || name || ';)');

run;

Another way to do this would be using call symputx:

data _null_;

set sashelp.class;

call symputx('zzz'||name,'','g');

run;

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 2 replies
  • 1072 views
  • 0 likes
  • 3 in conversation