@JJP1 wrote:
Hi All,sorry for confusion. Iam running below code to create year and month which is giving desired values what i need for year and month. but i don't want to use "%sysfunc".i tried by removing the %sysfunc.i am constantly getting the posted syntax error.please help
proc sql;
create table work.W5WITF2 as
select
Num length = 10,
(%sysfunc(putn(%sysfunc(intnx(month,%sysfunc(today()),-1),month2.),z2.))) as Month length = 3
format = Z2.
label = 'Month',
(%sysfunc(intnx(month,%sysfunc(today()),-1),year4.)) as length = 3
format = Z4.
label = 'Year'
from work.W5WITF2;
;
quit;
%SYSFUNC() is a macro function that allows you to call a normal SAS function in macro code. Once the macro processor finishes evaluating the macro expression the resulting text is passed onto SAS to process. One way to help you debug the code is to remove the macro code and just replace it with the text it would generate and then you can debug that code. Once you have the SAS code debugged you can replace the text with the macro code that generates the text and start debugging the macro aspects of your code.
So here is your code with the macro function call replaced with representative values. I also cleaned up the formatting a little to make it a little easier to read.
proc sql;
create table work.W5WITF2 as
select
Num length = 10
, (10) as Month length = 3 format = Z2. label = 'Month'
, (2019) as length = 3 format = Z4. label = 'Year'
from work.W5WITF2
;
quit;
Let's review the three variables you are defining in the SELECT clause.
First you are taking the variable NUM and changing its length to 10. So NUM must be a character variable that is in the dataset WSWITF2 since the maximum length that SAS can use to store a numeric variable is the full 8 bytes that the floating point numbers SAS uses require.
Next you are storing the number 10, the extra parentheses around the value do not change it, and are calling MONTH. You are telling SAS to display it as two digits with leading zeros. You are telling it that the label is the same as the name (why attach a label if it is just going to have the same value as the name?). You are also telling it remove the 5 least significant bytes from the value when storing it into the dataset. That should be fine if the value is only ever the integers 1 to 12.
Next you are trying to do the same thing with the number 2019, but in this case you forgot to give SAS name for this variable.
... View more