<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Macro quoting function to mask (%) at SAS execution time in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425319#M104756</link>
    <description>&lt;P&gt;would %&lt;STRONG&gt;nrstr&lt;/STRONG&gt; help instead of %str here:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class=" language-sas"&gt;&lt;CODE class="  language-sas"&gt;&lt;SPAN class="token macrostatement"&gt;%put&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt; The Key is: &lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;paramname and &lt;SPAN class="token keyword"&gt;value&lt;/SPAN&gt; is &lt;SPAN class="token macrostatement"&gt;%unquote&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token macrostatement"&gt;%str&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;val&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;paramname1&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;&amp;lt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;/*existing version*/&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE class=" language-sas"&gt;&lt;CODE class="  language-sas"&gt;&lt;SPAN class="token macrostatement"&gt;%put&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt; The Key is: &lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;paramname and &lt;SPAN class="token keyword"&gt;value&lt;/SPAN&gt; is &lt;SPAN class="token macrostatement"&gt;%unquote&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token macrostatement"&gt;%nrstr&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;val&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;paramname1&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;&amp;lt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;/*my opinion*/&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 05 Jan 2018 18:39:07 GMT</pubDate>
    <dc:creator>novinosrin</dc:creator>
    <dc:date>2018-01-05T18:39:07Z</dc:date>
    <item>
      <title>Macro quoting function to mask (%) at SAS execution time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425308#M104752</link>
      <description>&lt;P&gt;With SAS 94M4, I have a macro parameter value that contains the trigger for the macro processor (%).&amp;nbsp; I need this parameter value to be triggered at macro compile time, however at SAS execution time, I need a quoting function that does not attempt to resolve what appears as a macro reference.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;At least that is how I understand the timing of things here.&amp;nbsp; &amp;nbsp;The SAS log is below, followed by the program.&amp;nbsp; Any insights are appreciated along with how masking/unmasking and compile/execution timing for Macro quoting.&amp;nbsp; I found Ian Whitlock's paper to be a great deal of help at:&lt;/P&gt;&lt;P&gt;&lt;A href="http://www2.sas.com/proceedings/sugi28/011-28.pdf" target="_blank"&gt;http://www2.sas.com/proceedings/sugi28/011-28.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt; options mtrace mlogic mprint;
18   %let ds = WORK.mm_var;
19
20   %macro getargument(paramname=);
21      %* Get count for key values;
22      %* Get key values;
23
24      proc sql noprint;
25         select count(key) into :key_count
26         from &amp;amp;ds.;
27
28         select key into :key_values separated by "+"
29         from &amp;amp;ds.;
30      quit;
31
32      %put ===&amp;gt; key values are &amp;amp;key_values;
33      %* Test to see of the paramvalue is valid;
34
35      %if %sysfunc(indexw(&amp;amp;key_values, "&amp;amp;paramname", "+")) = 0 %then %do;
36         %put ===&amp;gt; The parameter "&amp;amp;paramname" is not valid.;
37         %put ===&amp;gt; Exiting the Macro.;
38         %goto exit;
39      %end;
40
41      %* Test to see if the paramname value is &amp;lt;blank&amp;gt;;
42
43      %if %sysevalf(%superq(paramname)=,boolean) %then %do;
44         %put ===&amp;gt;  The paramname value is "&amp;lt;blank&amp;gt;" existing MACRO;
45         %goto exit;
46      %end;
47
48      %* Test to see if the paramname value contains &amp;lt;blank&amp;gt; characters;
49      %* If true, replace &amp;lt;blank&amp;gt; with underscore (_);
50
51      %if %sysfunc(find(%bquote(&amp;amp;paramname),%str( ))) &amp;gt; 0 %then %do;
52
53         %let paramname1=%sysfunc(translate(%bquote(&amp;amp;paramname),%str(_),%str( )));
54            proc sql noprint;
55               select value into :val&amp;amp;paramname1
56               from &amp;amp;ds
57               where soundex(key) = soundex("&amp;amp;paramname");
58            quit;
59
60         %put ========================&amp;lt;&amp;gt;==========================;
61         %put ===&amp;gt; The Key is: &amp;amp;paramname and value is %unquote(%str(&amp;amp;&amp;amp;val&amp;amp;paramname1)) &amp;lt;===;
62
63         %goto exit;
64      %end;
65
66      proc sql noprint;
67          select value into :val
68          from &amp;amp;ds
69          where soundex(key) = soundex("&amp;amp;paramname");
70      quit;
71
72         %put ========================&amp;lt;&amp;gt;==========================;
73         %put ===&amp;gt; The Key is: &amp;amp;paramname and value is %trim(&amp;amp;val) &amp;lt;===;
74
75   %exit:
76   %mend;
77   run;
78   %getargument(paramname=trips up macro);
MLOGIC(GETARGUMENT):  Beginning execution.
MLOGIC(GETARGUMENT):  Parameter PARAMNAME has value trips up macro
MPRINT(GETARGUMENT):   proc sql noprint;
MPRINT(GETARGUMENT):   select count(key) into :key_count from WORK.mm_var;
MPRINT(GETARGUMENT):   select key into :key_values separated by "+" from WORK.mm_var;
MPRINT(GETARGUMENT):   quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.02 seconds
      cpu time            0.01 seconds


MLOGIC(GETARGUMENT):  %PUT ===&amp;gt; key values are &amp;amp;key_values
===&amp;gt; key values are kpi+EVAL1+benchmark+workdir+inputfile1+input file forsas+trips up macro
MLOGIC(GETARGUMENT):  %IF condition %sysfunc(indexw(&amp;amp;key_values, "&amp;amp;paramname", "+")) = 0 is FALSE
MLOGIC(GETARGUMENT):  %IF condition %sysevalf(%superq(paramname)=,boolean) is FALSE
MLOGIC(GETARGUMENT):  %IF condition %sysfunc(find(%bquote(&amp;amp;paramname),_ _)) &amp;gt; 0 is TRUE
MLOGIC(GETARGUMENT):  %LET (variable name is PARAMNAME1)
MPRINT(GETARGUMENT):   proc sql noprint;
MPRINT(GETARGUMENT):   select value into :valtrips_up_macro from WORK.mm_var where soundex(key) =
soundex("trips up macro");
MPRINT(GETARGUMENT):   quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.00 seconds
      cpu time            0.01 seconds


MLOGIC(GETARGUMENT):  %PUT ========================&amp;lt;&amp;gt;==========================
========================&amp;lt;&amp;gt;==========================
MLOGIC(GETARGUMENT):  %PUT ===&amp;gt; The Key is: &amp;amp;paramname and value is %unquote(_&amp;amp;&amp;amp;val&amp;amp;paramname1_)
      &amp;lt;===
WARNING: Apparent invocation of macro _SIGN not resolved.
WARNING: Apparent invocation of macro _SIGN not resolved.
===&amp;gt; The Key is: trips up macro and value is /home/sas/file_with_%_sign.sas

                                                                                          &amp;lt;===
MLOGIC(GETARGUMENT):  %GOTO EXIT (label resolves to EXIT).
MLOGIC(GETARGUMENT):  Ending execution.
79
80   run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;The program is:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;options mprint mlogic mtrace;
DATA mm_var;
length key   $ 128
       value $ 1024;
INPUT KEY $ &amp;amp; @21 VALUE $;
DATALINES4;
kpi                 80
EVAL1               90
benchmark           70
workdir             /tmp/x
inputfile1          /tmp/x/input/file1.csv
input file forsas   /MM/RTemp/tmp.Fi8jheBOAu/input/5a4e0eaad8e0c3b8d782609f
trips up macro      /home/sas/file_with_%_sign.sas
;;;;
RUN;
proc print;run;
options mtrace mlogic mprint;
%let ds = WORK.mm_var;

%macro getargument(paramname=);
   %* Get count for key values;
   %* Get key values;

   proc sql noprint;
      select count(key) into :key_count
      from &amp;amp;ds.;

      select key into :key_values separated by "+"
      from &amp;amp;ds.;
   quit;

   %put ===&amp;gt; key values are &amp;amp;key_values;
   %* Test to see if the paramvalue is valid;

   %if %sysfunc(indexw(&amp;amp;key_values, "&amp;amp;paramname", "+")) = 0 %then %do;
      %put ===&amp;gt; The parameter "&amp;amp;paramname" is not valid.;
	  %put ===&amp;gt; Exiting the Macro.;
	  %goto exit;
   %end;
 
   %* Test to see if the paramname value contains &amp;lt;blank&amp;gt; characters;
   %* If true, replace &amp;lt;blank&amp;gt; with underscore (_);
    
   %if %sysfunc(find(%bquote(&amp;amp;paramname),%str( ))) &amp;gt; 0 %then %do;
    
      %let paramname1=%sysfunc(translate(%bquote(&amp;amp;paramname),%str(_),%str( ))); 
	     proc sql noprint;
	        select value into :val&amp;amp;paramname1
	        from &amp;amp;ds
	        where soundex(key) = soundex("&amp;amp;paramname");
	     quit;

	  %put ========================&amp;lt;&amp;gt;==========================;
      %put ===&amp;gt; The Key is: &amp;amp;paramname and value is %unquote(%str(&amp;amp;&amp;amp;val&amp;amp;paramname1)) &amp;lt;===;

	  %goto exit;
   %end;   

   proc sql noprint;
	   select value into :val
	   from &amp;amp;ds
	   where soundex(key) = soundex("&amp;amp;paramname");
   quit;

	  %put ========================&amp;lt;&amp;gt;==========================;
      %put ===&amp;gt; The Key is: &amp;amp;paramname and value is %trim(&amp;amp;val) &amp;lt;===;      

%exit:
%mend;
run;
%getargument(paramname=trips up macro);

run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 05 Jan 2018 17:50:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425308#M104752</guid>
      <dc:creator>trb1</dc:creator>
      <dc:date>2018-01-05T17:50:29Z</dc:date>
    </item>
    <item>
      <title>Re: Macro quoting function to mask (%) at SAS execution time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425319#M104756</link>
      <description>&lt;P&gt;would %&lt;STRONG&gt;nrstr&lt;/STRONG&gt; help instead of %str here:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class=" language-sas"&gt;&lt;CODE class="  language-sas"&gt;&lt;SPAN class="token macrostatement"&gt;%put&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt; The Key is: &lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;paramname and &lt;SPAN class="token keyword"&gt;value&lt;/SPAN&gt; is &lt;SPAN class="token macrostatement"&gt;%unquote&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token macrostatement"&gt;%str&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;val&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;paramname1&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;&amp;lt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;/*existing version*/&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;&lt;PRE class=" language-sas"&gt;&lt;CODE class="  language-sas"&gt;&lt;SPAN class="token macrostatement"&gt;%put&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;gt;&lt;/SPAN&gt; The Key is: &lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;paramname and &lt;SPAN class="token keyword"&gt;value&lt;/SPAN&gt; is &lt;SPAN class="token macrostatement"&gt;%unquote&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token macrostatement"&gt;%nrstr&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;(&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;val&lt;SPAN class="token operator"&gt;&amp;amp;&lt;/SPAN&gt;paramname1&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;)&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;&amp;lt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;/*my opinion*/&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 05 Jan 2018 18:39:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425319#M104756</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2018-01-05T18:39:07Z</dc:date>
    </item>
    <item>
      <title>Re: Macro quoting function to mask (%) at SAS execution time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425321#M104758</link>
      <description>&lt;P&gt;I think you are mostly running into trouble in the %put here; that's because you %unquote, which is inevitably going to cause an issue I think.&amp;nbsp; Unquoting&amp;nbsp;attempts to resolve the macro variable, which is a problem here clearly.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I prefer %superq for these scenarios:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;   %if %sysfunc(find(%superq(paramname),%str( ))) &amp;gt; 0 %then %do;
    
      %let paramname1=%sysfunc(translate(%superq(paramname),%str(_),%str( ))); 
	     proc sql noprint;
	        select value into :val&amp;amp;paramname1 trimmed
	        from &amp;amp;ds
	        where soundex(key) = soundex("&amp;amp;paramname");
	     quit;

	  %put ========================&amp;lt;&amp;gt;==========================;
      %put ===&amp;gt; The Key is: &amp;amp;paramname and value is  %superq(val&amp;amp;paramname1) &amp;lt;===;

	  %goto exit;
   %end;   &lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;No unquoting needed, I don't think.&amp;nbsp; I add TRIMMED option to PROC SQL so you don't get that big giant pile of excess spaces.&lt;/P&gt;</description>
      <pubDate>Fri, 05 Jan 2018 18:43:33 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425321#M104758</guid>
      <dc:creator>snoopy369</dc:creator>
      <dc:date>2018-01-05T18:43:33Z</dc:date>
    </item>
    <item>
      <title>Re: Macro quoting function to mask (%) at SAS execution time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425324#M104760</link>
      <description>%UNQUOTE will still attempt to resolve it, unfortunately.</description>
      <pubDate>Fri, 05 Jan 2018 18:42:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425324#M104760</guid>
      <dc:creator>snoopy369</dc:creator>
      <dc:date>2018-01-05T18:42:51Z</dc:date>
    </item>
    <item>
      <title>Re: Macro quoting function to mask (%) at SAS execution time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425325#M104761</link>
      <description>&lt;P&gt;hmm true. Thank you!&lt;/P&gt;</description>
      <pubDate>Fri, 05 Jan 2018 18:43:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425325#M104761</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2018-01-05T18:43:24Z</dc:date>
    </item>
    <item>
      <title>Re: Macro quoting function to mask (%) at SAS execution time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425384#M104784</link>
      <description>&lt;P&gt;Your macro is working way to hard.&amp;nbsp; No need to query the data twice to get the count, SQL will count for you. No need for SOUNDEX() since you already.eliminated user input that didn't match the key names. No need to make different macro variable names depending on whether or not key name has a space in it.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro getargument(paramname=);
%local key_count key_values mvar ;
proc sql noprint;
  select upcase(key)
    into :key_values separated by "+"
    from &amp;amp;ds.
  ;
%let key_count=&amp;amp;sqlobs;
quit;

%put ===&amp;gt; &amp;amp;=key_count &amp;amp;=key_values ;

%* Test to see if the paramvalue is valid;
%if %sysfunc(indexw(&amp;amp;key_values,%qupcase(&amp;amp;paramname),+)) = 0 %then %do;
  %put ===&amp;gt; The parameter "&amp;amp;paramname" is not valid.;
  %put ===&amp;gt; Exiting the Macro.;
  %goto exit;
%end;
 
%* Make Name of macro variable to hold value of parameter ;
%* Include paramname but replace &amp;lt;blank&amp;gt; with underscore (_);
%let mvar=val%sysfunc(translate(%superq(paramname),%str(_),%str( ))); 
%local &amp;amp;mvar ;

%* Get value ;
proc sql noprint;
  select value into :&amp;amp;mvar trimmed
    from &amp;amp;ds
    where upcase(key) = "%upcase(&amp;amp;paramname)"
  ;
quit;

%put ========================&amp;lt;&amp;gt;==========================;
%put ===&amp;gt; The Key is: "&amp;amp;paramname" and value is %qsysfunc(quote(%superq(&amp;amp;mvar))) &amp;lt;===;

%exit:
%mend;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Testing results&lt;/P&gt;
&lt;PRE&gt;786   %getargument(paramname=trips up macro);
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


===&amp;gt; KEY_COUNT=7 KEY_VALUES=KPI+EVAL1+BENCHMARK+WORKDIR+INPUTFILE1+INPUT FILE FORSAS+TRIPS UP MACRO
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


========================&amp;lt;&amp;gt;==========================
===&amp;gt; The Key is: "trips up macro" and value is "/home/sas/file_with_%_sign.sas" &amp;lt;===
787   %getargument(paramname=Notfound);
NOTE: PROCEDURE SQL used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


===&amp;gt; KEY_COUNT=7 KEY_VALUES=KPI+EVAL1+BENCHMARK+WORKDIR+INPUTFILE1+INPUT FILE FORSAS+TRIPS UP MACRO
===&amp;gt; The parameter "Notfound" is not valid.
===&amp;gt; Exiting the Macro.

&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 05 Jan 2018 21:02:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425384#M104784</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2018-01-05T21:02:59Z</dc:date>
    </item>
    <item>
      <title>Re: Macro quoting function to mask (%) at SAS execution time</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425401#M104794</link>
      <description>&lt;P&gt;Hired!&amp;nbsp; When can you start&amp;nbsp;&lt;img id="smileyhappy" class="emoticon emoticon-smileyhappy" src="https://communities.sas.com/i/smilies/16x16_smiley-happy.png" alt="Smiley Happy" title="Smiley Happy" /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This is the best all around solution since it handles the problem with parameter values containing both Macro triggers (&amp;amp;, %).&amp;nbsp; You are also correct that I am applying too many tests for conditions--where yours is the more generalized approach.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks to all!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 05 Jan 2018 21:40:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Macro-quoting-function-to-mask-at-SAS-execution-time/m-p/425401#M104794</guid>
      <dc:creator>rbetancourt</dc:creator>
      <dc:date>2018-01-05T21:40:30Z</dc:date>
    </item>
  </channel>
</rss>

