BookmarkSubscribeRSS Feed
dhana
Fluorite | Level 6


I have the following piece of code.

%put &BALDT_DATE9.;

BALDT_DATE9 resolves to '22NOV2017'D

proc sql;
create table test_temp as
select * from sasd.basedata
where SESSION_DATE <= &BALDT_DATE9.
;
quit;

I am trying to subset the base dataset using the date condition. But for some reason I am keep getting the following error message.

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant,
a missing value, (, +, -, ALL, ANY, BTRIM, CALCULATED, CASE, INPUT, PUT, SELECT, SOME, SUBSTRING, TRANSLATE, USER.
ERROR 200-322: The symbol is not recognized and will be ignored.

Can some help ?

6 REPLIES 6
Reeza
Super User

Please post your exact code and log. 

 


@dhana wrote:


I have the following piece of code.

%put &BALDT_DATE9.;

BALDT_DATE9 resolves to '22NOV2017'D

proc sql;
create table test_temp as
select * from sasd.basedata
where SESSION_DATE <= &BALDT_DATE9.
;
quit;

I am trying to subset the base dataset using the date condition. But for some reason I am keep getting the following error message.

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant,
a missing value, (, +, -, ALL, ANY, BTRIM, CALCULATED, CASE, INPUT, PUT, SELECT, SOME, SUBSTRING, TRANSLATE, USER.
ERROR 200-322: The symbol is not recognized and will be ignored.

Can some help ?


 

dhana
Fluorite | Level 6
DATA _NULL_;
SET TEMP.LATEST_BAL_DATE;
DT3=PUT(MAX_BAL_DATE,DATE9.);
CALL SYMPUT("BALDT_DATE9",DT3);
RUN;

%LET BALDT_DATE9=%STR(%')&BALDT_DATE9.%STR(%'D);
%PUT &BALDT_DATE9.;

PROC SQL;
CREATE TABLE TEST_TEMP AS 
SELECT * FROM 
SASD.CBOL_DEP_APPLICATIONS_20171122
WHERE SESSION_DATE_AT_APPSTART <= &BALDT_DATE9.
;
QUIT;

Log:-

 

21 DATA _NULL_;
22 SET TEMP.LATEST_BAL_DATE;
23 DT3=PUT(MAX_BAL_DATE,DATE9.);
24 CALL SYMPUT("BALDT_DATE9",DT3);
25 RUN;

NOTE: There were 1 observations read from the data set TEMP.LATEST_BAL_DATE.
NOTE: DATA statement used (Total process time):
real time 0.58 seconds
user cpu time 0.01 seconds
system cpu time 0.00 seconds
memory 536.00k
OS Memory 18336.00k
Timestamp 11/27/2017 11:01:22 PM
Step Count 67 Switch Count 36
Page Faults 0
Page Reclaims 92
Page Swaps 0
Voluntary Context Switches 124
Involuntary Context Switches 0
Block Input Operations 0
Block Output Operations 0

26
27 %LET BALDT_DATE9=%STR(%')&BALDT_DATE9.%STR(%'D);
SYMBOLGEN: Macro variable BALDT_DATE9 resolves to 22NOV2017
28 %PUT &BALDT_DATE9.;
SYMBOLGEN: Macro variable BALDT_DATE9 resolves to '22NOV2017'D
SYMBOLGEN: Some characters in the above value which were subject to macro quoting have been unquoted for printing.
'22NOV2017'D
29
30 PROC SQL;
31 CREATE TABLE TEST_TEMP AS
32 SELECT * FROM
2 The SAS System 21:18 Monday, November 27, 2017

33 SASD.CBOL_DEP_APPLICATIONS_20171122
34 WHERE SESSION_DATE_AT_APPSTART <= &BALDT_DATE9.
SYMBOLGEN: Macro variable BALDT_DATE9 resolves to '22NOV2017'D
SYMBOLGEN: Some characters in the above value which were subject to macro quoting have been unquoted for printing.
35 ;
NOTE: PROC SQL set option NOEXEC and will continue to check the syntax of statements.
NOTE: Line generated by the macro variable "BALDT_DATE9".
35 '22NOV2017'D
_
22
_
200
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant,
a missing value, (, +, -, ALL, ANY, BTRIM, CALCULATED, CASE, INPUT, PUT, SELECT, SOME, SUBSTRING, TRANSLATE, USER.

ERROR 200-322: The symbol is not recognized and will be ignored.

Reeza
Super User

Rather than add quotes to the macro variable use it in the code. 

 

Bal_date <= “&baldt_date9.”d;

Or use the number and don’t use a format when you create the macro variable. 

 

Also, use CALL SYMPUTX 

Tom
Super User Tom
Super User

If you post a log use the Insert Code button so that the forum editor doesn't messup the spacing.

 

Looks to me like you have added macro quoting to the value of macro variable.  It is confusing SAS. Remove it. 

WHERE SESSION_DATE_AT_APPSTART <= %unquote(&BALDT_DATE9.)

Why did you add the macro quoting? It is not needed.

%LET BALDT_DATE9="&BALDT_DATE9."d;

 Or just use the actual number of days.

CALL SYMPUTX("BALDT",MAX_BAL_DATE);
...
WHERE SESSION_DATE_AT_APPSTART <= &BALDT

 

mkeintz
PROC Star

You can solve the problem using your definition of BALDT_DATE9 by changing the where-clause to

  

WHERE SESSION_DATE_AT_APPSTART <= %unquote(&BALDT_DATE9)

 

But as a general rule I would not bother with the %STR(%') and %unquote macro functions. Instead leave BALDT_DATE9 without the quotes (i.e  BALDT_DATE9=22NOV2017).  Then whenever you want to use it as a date constant, just use "&BALDT_DATE9"D, as in

 

WHERE SESSION_DATE_AT_APPSTART <= "&BALDT_DATE9"D

 

This takes advantage of the fact that double quotes do not prevent resolution of macro expressions inside the quotes.

 

 

 

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------
Kurt_Bremser
Super User

Maim 28: macro variables need no formats:

DATA _NULL_;
DT3=PUT(today(),best.);
CALL SYMPUT("BALDT_DATE9",DT3);
RUN;

%PUT &BALDT_DATE9.;

data test;
SESSION_DATE_AT_APPSTART = today() -1;
run;

PROC SQL;
CREATE TABLE TEST_TEMP AS 
SELECT * FROM 
test
WHERE SESSION_DATE_AT_APPSTART <= &BALDT_DATE9.
;
QUIT;

For comparisons, raw values are best.

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 6 replies
  • 9953 views
  • 1 like
  • 5 in conversation