SAS-在表名中使用变量

SAS-在表名中使用变量,sas,proc-sql,Sas,Proc Sql,对SAS来说比较新,但我遇到了一个不寻常的问题。我使用一些procsql语句根据最近一个月动态创建一个变量。我要检索的表中有一个月名,我想循环。 例如,图书馆、表1、17、所有 LIBRARY.TABLE_DEC16_ALL等 示例代码: DATA qtrMonth; INPUT vDay vMonth vMonthName $; DATALINES; 31 01 JAN 28 02 FEB 31 03 MAR 30 04 APR 31 05 MAY 30 06 JUN 31 07 JUL

对SAS来说比较新,但我遇到了一个不寻常的问题。我使用一些procsql语句根据最近一个月动态创建一个变量。我要检索的表中有一个月名,我想循环。 例如,图书馆、表1、17、所有 LIBRARY.TABLE_DEC16_ALL等

示例代码:

 DATA qtrMonth;
 INPUT vDay vMonth vMonthName $;
 DATALINES;
31 01 JAN
28 02 FEB
31 03 MAR
30 04 APR
31 05 MAY
30 06 JUN
31 07 JUL
31 08 AUG
30 09 SEP
31 10 OCT
30 11 NOV
31 12 DEC
;

DATA year;
INPUT vYear ;
DATALINES;
14
15
16
17
;
run;

/* Next step is to do a cartesian join to populate
   all possible Month & Year combos in the dataset  */
PROC SQL;
    create table popCalendar as
    SELECT 
    mdy(a.vMonth,a.vDay, b.vYear) as MyDate format  DATE9.
    ,CAT(TRIM(a.vMonthName), b.vYear) as MonthName
    FROM qtrMonth a
    CROSS JOIN year b
    ;
quit;

PROC SQL;
create table tmpMax as 
Select Max(MyDate) as MaxDate
FROM popCalendar
WHERE MyDate < today();

/*select max monthName into vMonth variable */
SELECT trim(MonthName) into :vMonth
FROM popCalendar a
inner join tmpMAX b on a.MyDate = b.MaxDate;
quit;

/*Select from table using variable*/
proc sql;
create table abc as 
select * from LIBRARY.TABLE_&vMonth._ALL;
有人能就问题所在提出建议吗


谢谢

有两个可能的问题。最简单的方法是在宏变量中插入空格。要检验这个理论,只需用周围的东西来显示它的价值

%put |&vmonth|;
SQL代码在生成宏变量时,应使用TRIMMED关键字(如果您运行的是旧版本的SAS,则使用SEPARATED BY关键字)强制SAS删除空格

SELECT MonthName into :vMonth trimmed

另一种可能性是,SAS编译器在对象名称中间看到宏引用而混淆,即使在值中没有实际的嵌入空白,也会错误地将其视为两个或多个令牌。但这通常仅在宏变量值已被宏引用时发生。如果您看到该值中没有实际空格,请尝试使用

%unquote()
宏函数

select * from LIBRARY.%unquote(TABLE_&vMonth._ALL);

谢谢你,汤姆,这个关键词起作用了。我当时正在使用trim(monthName),但后来没有意识到它有空格。
select * from LIBRARY.%unquote(TABLE_&vMonth._ALL);