Hello,
I try to pass a global variable in the urlencode function and get an invalid link, I run the following code:
%let globalVar = 201080;
data test;
original_string = urlencode('<SMF_REPLY><SMF_REQUEST_ID>aaa</SMF_REQUEST_ID><SMF_RETURN_CODE>1</SMF_RETURN_CODE><SMF_RETURN_MESSAGE>&globalVar</SMF_RETURN_MESSAGE></SMF_REPLY>');
run;
If I enter the number itself 201080 I will get a proper link.
my question is how to pass a global variable to the urlencode function?
I get a valid link:
urlencode('<SMF_REPLY><SMF_REQUEST_ID>aaa</SMF_REQUEST_ID><SMF_RETURN_CODE>1</SMF_RETURN_CODE><SMF_RETURN_MESSAGE>201080</SMF_RETURN_MESSAGE></SMF_REPLY>')
thanks.
Below code should do as long as you don't expect an ampersand or percent sign in your source string that shouldn't get interpreted as a macro token.
%let globalVar = 201080;
data test;
length original_string $300;
original_string =
'<?xml version="1.0" encoding="UTF-8"?><SMF_REPLY><SMF_REQUEST_ID>aaa</SMF_REQUEST_ID><SMF_RETURN_CODE>1</SMF_RETURN_CODE><SMF_RETURN_MESSAGE>&globalVar</SMF_RETURN_MESSAGE></SMF_REPLY>';
original_string=urlencode(strip(resolve(original_string)));
put original_string;
run;
The encoded string will be longer than the original string. Make sure that your variable has a length defined that's sufficient for the encoded string.
Or this way will also work
data test;
length original_string $300;
original_string = cats(
'<?xml version="1.0" encoding="UTF-8"?><SMF_REPLY><SMF_REQUEST_ID>aaa</SMF_REQUEST_ID><SMF_RETURN_CODE>1</SMF_RETURN_CODE><SMF_RETURN_MESSAGE>'
,"&globalVar</SMF_RETURN_MESSAGE></SMF_REPLY>"
);
original_string=urlencode(strip(original_string));
put original_string;
run;
You need to use double quotes for the SAS macro variable to resolve.
%let globalVar = 201080;
data test;
original_string = urlencode("<SMF_REPLY><SMF_REQUEST_ID>aaa</SMF_REQUEST_ID><SMF_RETURN_CODE>1</SMF_RETURN_CODE><SMF_RETURN_MESSAGE>&globalVar</SMF_RETURN_MESSAGE></SMF_REPLY>");
run;
Below code should do as long as you don't expect an ampersand or percent sign in your source string that shouldn't get interpreted as a macro token.
%let globalVar = 201080;
data test;
length original_string $300;
original_string =
'<?xml version="1.0" encoding="UTF-8"?><SMF_REPLY><SMF_REQUEST_ID>aaa</SMF_REQUEST_ID><SMF_RETURN_CODE>1</SMF_RETURN_CODE><SMF_RETURN_MESSAGE>&globalVar</SMF_RETURN_MESSAGE></SMF_REPLY>';
original_string=urlencode(strip(resolve(original_string)));
put original_string;
run;
The encoded string will be longer than the original string. Make sure that your variable has a length defined that's sufficient for the encoded string.
Or this way will also work
data test;
length original_string $300;
original_string = cats(
'<?xml version="1.0" encoding="UTF-8"?><SMF_REPLY><SMF_REQUEST_ID>aaa</SMF_REQUEST_ID><SMF_RETURN_CODE>1</SMF_RETURN_CODE><SMF_RETURN_MESSAGE>'
,"&globalVar</SMF_RETURN_MESSAGE></SMF_REPLY>"
);
original_string=urlencode(strip(original_string));
put original_string;
run;
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.