- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Posted 04-27-2021 03:14 AM
(1374 views)
Hi,
I do not manage to get column names from my dataset using proc sql.
What's wrong in the following example code ?
data work.birthday;
input @01 employee_id 6.
@08 last_name $10.
@19 birthday date7.;
format employee_id 6.
last_name $10.
birthday date7.;
datalines;
1247 Garcia 04APR54
1078 Gibson 23APR36
1005 Knapp 06OCT38
1024 Mueller 17JUN53
;
proc print data=work.birthday;
title2 'SAS Data Set work.BIRTHDAY';
run;
proc sql;
select * into :charlist separated by ' '
from dictionary.columns
where libname="work" and memname="birthday"
;
quit;
3 REPLIES 3
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi @ctisseuil,
- Write "select name ..." instead of "select * ..."
- Specify libname and memname values in UPPER CASE in the WHERE clause.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
And adding to @FreelanceReinh : The values for libname and memname are always uppercase
where libname="WORK" and memname="BIRTHDAY"
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Do you want the full list of problems? Or just the problems with the part that is trying to gather variable names?
Let's start with the last step:
proc sql;
select * into :charlist separated by ' '
from dictionary.columns
where libname="work" and memname="birthday"
;
quit;
Issues:
- Add the NOPRINT option to the PROC SQL so the names are not also printed to the output window.
- Specify the actual value you want to put into the macro variable. This would only select the variable NAME if that happens to be the first variable that would get selected by the * shortcut for all varaibles.
- Values of LIBNAME and MEMNAME are always uppercase in the DICTIONARY.COLUMNS.
- Do you care what order the names appear in the list?
- You also need to protect in case VALIDVARNAME option is set to ANY. That means some names might have spaces in them. You can use the NLITERAL() function for example Or use some other character as the separator in the list for values.
proc sql noprint;
select nliteral(name)
into :charlist separated by ' '
from dictionary.columns
where libname="WORK" and memname="BIRTHDAY"
order by varnum
;
quit;