Search code examples
macrossasquoting

SAS MACRO Quoting issue : passing string with macro trigger as macro parameter


Is this possible to pass a string with macro trigger as the macro parameter? Please see the example code below:

options mprint;
%let string5='%abc%def%';
%macro test(string);
data _null_;
    call execute('%test2('||&string.||')');
run;
%mend;

%macro test2(string2);
    data test3;
        a=%str(%')&string2.%str(%');
    run;
%mend;

%test(&string5);

This code ran successfully but it tried to invoke the macro %abc and %def, which resulted in warnings.

If I tried to put it into quoting to mask the string, it gave syntax error, as shown below:

options mprint;

    %let string5='%abc%def%';
    %macro test(string);

    data _null_;
        call execute('%test2('||%superQ(string)||')');
    run;
    %mend;

    %macro test2(string2);
        data test3;
            a=%str(%')&string2.%str(%');
        run;
    %mend;

    %test(&string5);

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, a missing value, arrayname, (, +, -, INPUT, NOT, PUT, ^, _NEW_, ~.  

Is there a way to fix this without warnings? Thanks in advance!


Solution

  • Try this:

    %let string5='%abc%def%';
    %macro test(string);
    data _null_;
        call execute('%test2('||%nrstr("&string.")||')');
    run;
    %mend;
    
    %macro test2(string2);
        data test3;
            a=%nrquote(&string2.);
        run;
    %mend;
    
    %test(&string5);