<?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: 'a' vs. %str(%')a%str(%') in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/a-vs-str-a-str/m-p/210373#M39014</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;SQL is notorious for failing to unquote characters in time to parse them correctly.&amp;nbsp; The most common application is passing a password to SQL, but the solution is straightforward in any event:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;where x=%unquote(&amp;amp;v2);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;That should handle the problem.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 19 Jun 2015 18:38:18 GMT</pubDate>
    <dc:creator>Astounding</dc:creator>
    <dc:date>2015-06-19T18:38:18Z</dc:date>
    <item>
      <title>'a' vs. %str(%')a%str(%')</title>
      <link>https://communities.sas.com/t5/SAS-Programming/a-vs-str-a-str/m-p/210372#M39013</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;This is largely a theoretical question about macro variables. I have two macro variables, v1 and v2. Both contain 3 characters consisting of 'a'&amp;nbsp; (e.g. a single quote, the lowercase letter a, and the ending single quote). If you test their values, you'll find that they are equal:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;dm log 'clear'; dm output 'clear';&lt;/P&gt;&lt;P&gt;option symbolgen mlogic mprint;&lt;/P&gt;&lt;P&gt;%macro myMacro;&lt;/P&gt;&lt;P&gt;%let v1='a';&lt;/P&gt;&lt;P&gt;%let v2=%str(%')a%str(%');&lt;/P&gt;&lt;P&gt;%if &amp;amp;v1=&amp;amp;v2 %then %put 1; %else %put 0;&lt;/P&gt;&lt;P&gt;%mend;&lt;/P&gt;&lt;P&gt;%myMacro&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Log:&lt;/P&gt;&lt;P&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp; dm log 'clear'; dm output 'clear';&lt;/P&gt;&lt;P&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp; option symbolgen mlogic mprint;&lt;/P&gt;&lt;P&gt;3&lt;/P&gt;&lt;P&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp; %macro myMacro;&lt;/P&gt;&lt;P&gt;5&amp;nbsp;&amp;nbsp;&amp;nbsp; %let v1='a';&lt;/P&gt;&lt;P&gt;6&amp;nbsp;&amp;nbsp;&amp;nbsp; %let v2=%str(%')a%str(%');&lt;/P&gt;&lt;P&gt;7&amp;nbsp;&amp;nbsp;&amp;nbsp; %if &amp;amp;v1=&amp;amp;v2 %then %put 1; %else %put 0;&lt;/P&gt;&lt;P&gt;8&amp;nbsp;&amp;nbsp;&amp;nbsp; %mend;&lt;/P&gt;&lt;P&gt;9&amp;nbsp;&amp;nbsp;&amp;nbsp; %myMacro&lt;/P&gt;&lt;P&gt;MLOGIC(MYMACRO):&amp;nbsp; Beginning execution.&lt;/P&gt;&lt;P&gt;MLOGIC(MYMACRO):&amp;nbsp; %LET (variable name is V1)&lt;/P&gt;&lt;P&gt;MLOGIC(MYMACRO):&amp;nbsp; %LET (variable name is V2)&lt;/P&gt;&lt;P&gt;SYMBOLGEN:&amp;nbsp; Macro variable V1 resolves to 'a'&lt;/P&gt;&lt;P&gt;SYMBOLGEN:&amp;nbsp; Macro variable V2 resolves to 'a'&lt;/P&gt;&lt;P&gt;SYMBOLGEN:&amp;nbsp; Some characters in the above value which were subject to macro quoting have been&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unquoted for printing.&lt;/P&gt;&lt;P&gt;MLOGIC(MYMACRO):&amp;nbsp; %IF condition &amp;amp;v1=&amp;amp;v2 is TRUE&lt;/P&gt;&lt;P&gt;MLOGIC(MYMACRO):&amp;nbsp; %PUT 1&lt;/P&gt;&lt;P&gt;1&lt;/P&gt;&lt;P&gt;MLOGIC(MYMACRO):&amp;nbsp; Ending execution.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;However, these 2 macro variables are different as illustrated in the next program:&lt;/P&gt;&lt;P&gt;data test;&lt;/P&gt;&lt;P&gt;x='a'; y=1; output;&lt;/P&gt;&lt;P&gt;x='b'; y=2; output;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*macro - this works*/&lt;/P&gt;&lt;P&gt;%let v1='a';&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;select * from test&lt;/P&gt;&lt;P&gt;where x=&amp;amp;v1;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*macro2 - this doesn't work*/&lt;/P&gt;&lt;P&gt;%let v2=%str(%')a%str(%');&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;select * from test&lt;/P&gt;&lt;P&gt;where x=&amp;amp;v2;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%put _all_;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This is the log:&lt;/P&gt;&lt;P&gt;20&amp;nbsp;&amp;nbsp; data test;&lt;/P&gt;&lt;P&gt;21&amp;nbsp;&amp;nbsp; x='a'; y=1; output;&lt;/P&gt;&lt;P&gt;22&amp;nbsp;&amp;nbsp; x='b'; y=2; output;&lt;/P&gt;&lt;P&gt;23&amp;nbsp;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;NOTE: The data set WORK.TEST has 2 observations and 2 variables.&lt;/P&gt;&lt;P&gt;NOTE: DATA statement used (Total process time):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.07 seconds&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.04 seconds&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;24&lt;/P&gt;&lt;P&gt;25&amp;nbsp;&amp;nbsp; /*macro - this works*/&lt;/P&gt;&lt;P&gt;26&amp;nbsp;&amp;nbsp; %let v1='a';&lt;/P&gt;&lt;P&gt;27&amp;nbsp;&amp;nbsp; proc sql;&lt;/P&gt;&lt;P&gt;28&amp;nbsp;&amp;nbsp; select * from test&lt;/P&gt;&lt;P&gt;29&amp;nbsp;&amp;nbsp; where x=&amp;amp;v1;&lt;/P&gt;&lt;P&gt;SYMBOLGEN:&amp;nbsp; Macro variable V1 resolves to 'a'&lt;/P&gt;&lt;P&gt;30&amp;nbsp;&amp;nbsp; quit;&lt;/P&gt;&lt;P&gt;NOTE: PROCEDURE SQL used (Total process time):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.09 seconds&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.06 seconds&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;31&lt;/P&gt;&lt;P&gt;32&amp;nbsp;&amp;nbsp; /*macro2 - this doesn't work*/&lt;/P&gt;&lt;P&gt;33&amp;nbsp;&amp;nbsp; %let v2=%str(%')a%str(%');&lt;/P&gt;&lt;P&gt;34&amp;nbsp;&amp;nbsp; proc sql;&lt;/P&gt;&lt;P&gt;35&amp;nbsp;&amp;nbsp; select * from test&lt;/P&gt;&lt;P&gt;36&amp;nbsp;&amp;nbsp; where x=&amp;amp;v2;&lt;/P&gt;&lt;P&gt;SYMBOLGEN:&amp;nbsp; Macro variable V2 resolves to 'a'&lt;/P&gt;&lt;P&gt;SYMBOLGEN:&amp;nbsp; Some characters in the above value which were subject to macro quoting have been&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unquoted for printing.&lt;/P&gt;&lt;P&gt;NOTE: Line generated by the macro variable "V2".&lt;/P&gt;&lt;P&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp; 'a'&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 22&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 200&lt;/P&gt;&lt;P&gt;ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a numeric constant, a datetime constant, a missing value, (, *, +, -, ALL, ANY,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BTRIM, CALCULATED, CASE, INPUT, PUT, SELECT, SOME, SUBSTRING, TRANSLATE, USER.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;ERROR 200-322: The symbol is not recognized and will be ignored.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;37&amp;nbsp;&amp;nbsp; quit;&lt;/P&gt;&lt;P&gt;NOTE: The SAS System stopped processing this step because of errors.&lt;/P&gt;&lt;P&gt;NOTE: PROCEDURE SQL used (Total process time):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.01 seconds&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.03 seconds&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;38&lt;/P&gt;&lt;P&gt;39&amp;nbsp;&amp;nbsp; %put _all_;&lt;/P&gt;&lt;P&gt;GLOBAL SQLOBS 0&lt;/P&gt;&lt;P&gt;GLOBAL V2&amp;nbsp;&amp;nbsp;&amp;nbsp; a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;GLOBAL SQLOOPS 0&lt;/P&gt;&lt;P&gt;GLOBAL SYS_SQL_IP_ALL -1&lt;/P&gt;&lt;P&gt;GLOBAL SYS_SQL_IP_STMT&lt;/P&gt;&lt;P&gt;GLOBAL SQLXOBS 0&lt;/P&gt;&lt;P&gt;GLOBAL SQLRC 8&lt;/P&gt;&lt;P&gt;GLOBAL SQLEXITCODE 0&lt;/P&gt;&lt;P&gt;GLOBAL V1 'a'&lt;/P&gt;&lt;P&gt;AUTOMATIC AFDSID 0&lt;/P&gt;&lt;P&gt;AUTOMATIC AFDSNAME&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In the log generated by %put _all_, the macro variable v2 has some garbage (e.g. delta characters). &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here's is my question. The value of the macro variable v2 is actually different from 'a'. This is a deliberate design by SAS or a bug?%&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Jun 2015 18:13:32 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/a-vs-str-a-str/m-p/210372#M39013</guid>
      <dc:creator>yuguo</dc:creator>
      <dc:date>2015-06-19T18:13:32Z</dc:date>
    </item>
    <item>
      <title>Re: 'a' vs. %str(%')a%str(%')</title>
      <link>https://communities.sas.com/t5/SAS-Programming/a-vs-str-a-str/m-p/210373#M39014</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;SQL is notorious for failing to unquote characters in time to parse them correctly.&amp;nbsp; The most common application is passing a password to SQL, but the solution is straightforward in any event:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;where x=%unquote(&amp;amp;v2);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;That should handle the problem.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Jun 2015 18:38:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/a-vs-str-a-str/m-p/210373#M39014</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2015-06-19T18:38:18Z</dc:date>
    </item>
    <item>
      <title>Re: 'a' vs. %str(%')a%str(%')</title>
      <link>https://communities.sas.com/t5/SAS-Programming/a-vs-str-a-str/m-p/210374#M39015</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;This is deliberate and a effect of the use of macro-quoting.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%let m=%str(%')M%str(%');&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;/* will not work */ select count(*) from sashelp.class where sex=&amp;amp;m.;&lt;/P&gt;&lt;P&gt;/* will work */ select count(*) from sashelp.class where sex=%unquote(&amp;amp;m.);&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Jun 2015 18:46:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/a-vs-str-a-str/m-p/210374#M39015</guid>
      <dc:creator>FriedEgg</dc:creator>
      <dc:date>2015-06-19T18:46:17Z</dc:date>
    </item>
  </channel>
</rss>

