Macros Proc SQL宏变量未解析
我通常先写一个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
%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是错误的原因。