Alex A.
Alex A.

Reputation: 5586

SAS ODS escape character macro variable error

The SAS v9.4 documentation lists an automatic macro variable &sysodsescapechar which contains the current ODS escape character, assigned using ods escapechar=.

Whenever I try to view the macro variable using a %put statement, I get the following error:

ERROR: Open code statement recursion detected.

This happens when open code erroneously causes a macro statement to call another macro statement.

I've tried all of the following:

%put &=sysodsescapechar.;
%put %nrbquote(&sysodsescapechar.);
%put %superq(sysodsescapechar);

They all result in the same error.

When I try to view the macro variable using a data step, it appears to be empty.

data test;
    esc = "&sysodsescapechar.";
    put esc=;
run;

If the macro variable actually is empty, why do I get open code statement recursion errors? The %put statement on its own is valid, so putting an empty variable shouldn't be an issue.

Any guidance here would be much appreciated.

Upvotes: 3

Views: 406

Answers (1)

Joe
Joe

Reputation: 63424

What's happening is the escape char seems to need a close parentheses. For example:

%put %superq(SYSODSESCAPECHAR););

;

It escapes the ) , which means now you have

%put superq(;);

In your first example, it's a little trickier because a semicolon by itself doesn't seem to be escaped so you have to provide a close parentheses:

%put &SYSODSESCAPECHAR.)x;

x

That works, for example. I'm not sure if it's only close paren or other things that would also allow it to stop trying to escape, but that's the only thing I can tell works.

You can look at the actual value of the macro variable in SASHELP.VMACRO; it's not ' ' (which is indeed what gets passed to the data step even with SYMGET, but it's clearly parsed). In that table it is '03'x, which looks like a uppercase L in the upper half of the character. That is the "End of Text" control character. I suspect the behavior in the editor when using this in text (in a macro variable) is simply a behavior of the editor - '03'x is not representable on many editors (if I try to paste it here, for example, it isn't displayed, but does exist as something I can backspace over with zero width). SAS is clearly capable of dealing with a 'normal' ods escapechar but isn't capable of dealing with '03'x in the same fashion.

Upvotes: 2

Related Questions