Macros Proc SQL宏变量未解析

Macros Proc SQL宏变量未解析,macros,sas,Macros,Sas,我通常先写一个proc-SQl,没有任何宏变量,它可以工作,现在我想把它转换成宏,但它不工作,你能看到问题出在哪里吗 %macro macrova(LIB=, DATA=); proc sql noprint; /*creating an in memory variable with all char variables from the dataset*/ select name into :names separated by ' ' from dic

我通常先写一个proc-SQl,没有任何宏变量,它可以工作,现在我想把它转换成宏,但它不工作,你能看到问题出在哪里吗

%macro macrova(LIB=, DATA=);

proc sql noprint;

/*creating an in memory variable with all char variables from the dataset*/

        select name into :names separated by ' '
        from dictionary.columns where libname="&lib" and memname="&data" and type='char'; 

/*to make sure we have the same order of the variables an in-memory variable ORDER is created*/

        SELECT NAME INTO: ORDER SEPARATED BY ' '
        from sashelp.vcolumn where LIBNAME= "&lib" and memname="&datA" ; 

quit;

%MEND;

OPTIONS MLOGIC SYMBOLGEN;
%macrova(LIB=SASHELP,DATA=CLASS)


%PUT &NAMES;
%PUT ℴ 
日志:


这些名称在宏内部创建为本地值,在宏外部不可用。尝试添加

%global NAMES ORDER;

SELECT
语句之前创建宏。

名称在宏内部创建为本地值,在宏外部不可用。尝试添加

%global NAMES ORDER;

在调用宏之前,您需要定义宏变量,或者在宏中添加%GLOBAL语句。否则,宏将被创建为本地,并在宏退出时消失

请注意,dictionary.columns中没有名为
ORDER
的变量,我假设您打算使用
VARNUM
变量

另外,不需要运行两个查询来生成两个宏变量

%macro macrova(LIB=, DATA=);
%global names order ;
proc sql noprint;
select name
     , varnum
  into :names separated by ' '
     , :order separated by ' '
from dictionary.columns 
where libname=%upcase("&lib")
  and memname=%upcase("&data")
  and type='char'
order by 2
; 
quit;
%mend macrova;

%macrova(LIB=SASHELP,DATA=CLASS)
%put &NAMES;
%put ℴ

您需要在调用宏之前定义宏变量,或者向宏中添加%GLOBAL语句。否则,宏将被创建为本地,并在宏退出时消失

请注意,dictionary.columns中没有名为
ORDER
的变量,我假设您打算使用
VARNUM
变量

另外,不需要运行两个查询来生成两个宏变量

%macro macrova(LIB=, DATA=);
%global names order ;
proc sql noprint;
select name
     , varnum
  into :names separated by ' '
     , :order separated by ' '
from dictionary.columns 
where libname=%upcase("&lib")
  and memname=%upcase("&data")
  and type='char'
order by 2
; 
quit;
%mend macrova;

%macrova(LIB=SASHELP,DATA=CLASS)
%put &NAMES;
%put ℴ

虽然这样做完全合法,但在一个查询中看到
dictionary.columns
,在第二个查询中看到
sashelp.vcolumn
,这有点令人困惑…@Joe好的,当我同时使用sashelp.vcolumn和DomPazz建议的,即使在编写全局语句之后,现在它没有给出宏变量的名称。为什么WHERE子句不同?如果它们不一样,结果就不一样了。虽然这样做是完全合法的,但在一个查询中看到
dictionary.columns
,在第二个查询中看到
sashelp.vcolumn
,这有点让人困惑…@Joe好吧,当我同时使用sashelp.vcolumn时,正如DomPazz所建议的,即使在编写了全局语句之后,现在它没有给出宏变量的名称。为什么WHERE子句不同?如果结果不一样,则结果将不一致。现在,对于语句%put&order,它是空的。请参见Tom的答案。错误的原因是缺少%GLOBAL。现在对于语句%put&order,它是空的。请参阅Tom的答案。丢失的%GLOBAL是错误的原因。