SAS 宏函数 return SQL 结果
SAS Macro function return SQL result
我是 SAS 和宏函数的新手。
我更喜欢我的代码 "DRY",所以我想将我有用的 sql 查询放入宏函数中 return 结果。
例如,我试过这个:
%macro getName;
%local nameq;
PROC SQL noprint;
SELECT b.name into :nameq from Country as b where b.ccountry = 100;
quit;
&nameq
%mend getNNSS;
%let tst = %getName;
%put &tst;
但是我得到这个错误:
ERROR 180-322: Statement is not valid or it is used out of proper order.
你能帮帮我吗?
谢谢
这里的问题是您实际上并不是在编写宏 函数(无论如何,这不是该语言的技术特性,而是学期)。任何类型的 SAS 宏都只是将文本放入输入流中,就好像它是由用户键入的一样。以 %
开头的事物将在幕后运行,但其他任何事物都将按原样简单地放置在输入流中。
宏函数被常见用法定义为执行其所有 calculations/etc 的宏。以这种方式,除了单个值之外,实际上没有任何东西被 returned 到系统 - 这样,它可以以与其他语言(或者,实际上,在 SAS 中)中的函数类似的方式使用。
因此,这是一个宏函数:
%macro mymacrofunction;
5
%mend mymacrofunction;
这不是:
%macro notafunction;
data test;
x=5;
run;
%mend notafunction;
因为你不能说
%let x=%notafunction;
因为那样会 return
%let x=data test; x=5; run;
这可能会出错(除非你 运行 它在数据步骤中,在这种情况下它可能根本无法按预期工作)。
对于您的宏:
%macro getName;
%local nameq;
PROC SQL noprint;
SELECT b.name into :nameq from Country as b where b.ccountry = 100;
quit;
&nameq
%mend getNNSS;
与 let 语句一起使用时的作用:
%let tst=proc sql noprint; select ... ; quit; &nameq
这不是你想要的,对吧。
您有多种方法可以解决这个问题。
PROC FCMP
PROC FCMP 是 SAS 函数编写语言。 PROC FCMP 确实 或多或少地编写了真正的函数 - 'less' 是它们实际上并不比它们包含的代码更有效,这与其他语言相反,但它们确实如此否则像 C 类型函数一样工作(它们完全在幕后运行并在自己的局部变量上执行自己的计算,returning 单个值,或 call routine
returning 多个值)。所以你可以用 FCMP
函数替换你的宏函数,假设你是 运行ning 9.3 或更新版本。
DOSUBL
DOSUBL 是一种要求 SAS 运行 完全在幕后执行宏的方法,这将允许您或多或少地做您想做的事情。
RUN_MACRO
in FCMP
这几乎可以直接与您正在做的事情一起工作:您只需将宏包装在 FCMP
函数中,使用 RUN_MACRO
来调用它。就简单性而言,这可能是您最好的选择。
有关宏函数的更多阅读,sascommunity.org has a page on the subject 链接到很多论文;或在搜索引擎或 LexJansen.com 上查找有关编写宏函数的论文。
我是 SAS 和宏函数的新手。 我更喜欢我的代码 "DRY",所以我想将我有用的 sql 查询放入宏函数中 return 结果。
例如,我试过这个:
%macro getName;
%local nameq;
PROC SQL noprint;
SELECT b.name into :nameq from Country as b where b.ccountry = 100;
quit;
&nameq
%mend getNNSS;
%let tst = %getName;
%put &tst;
但是我得到这个错误:
ERROR 180-322: Statement is not valid or it is used out of proper order.
你能帮帮我吗? 谢谢
这里的问题是您实际上并不是在编写宏 函数(无论如何,这不是该语言的技术特性,而是学期)。任何类型的 SAS 宏都只是将文本放入输入流中,就好像它是由用户键入的一样。以 %
开头的事物将在幕后运行,但其他任何事物都将按原样简单地放置在输入流中。
宏函数被常见用法定义为执行其所有 calculations/etc 的宏。以这种方式,除了单个值之外,实际上没有任何东西被 returned 到系统 - 这样,它可以以与其他语言(或者,实际上,在 SAS 中)中的函数类似的方式使用。
因此,这是一个宏函数:
%macro mymacrofunction;
5
%mend mymacrofunction;
这不是:
%macro notafunction;
data test;
x=5;
run;
%mend notafunction;
因为你不能说
%let x=%notafunction;
因为那样会 return
%let x=data test; x=5; run;
这可能会出错(除非你 运行 它在数据步骤中,在这种情况下它可能根本无法按预期工作)。
对于您的宏:
%macro getName;
%local nameq;
PROC SQL noprint;
SELECT b.name into :nameq from Country as b where b.ccountry = 100;
quit;
&nameq
%mend getNNSS;
与 let 语句一起使用时的作用:
%let tst=proc sql noprint; select ... ; quit; &nameq
这不是你想要的,对吧。
您有多种方法可以解决这个问题。
PROC FCMP
PROC FCMP 是 SAS 函数编写语言。 PROC FCMP 确实 或多或少地编写了真正的函数 - 'less' 是它们实际上并不比它们包含的代码更有效,这与其他语言相反,但它们确实如此否则像 C 类型函数一样工作(它们完全在幕后运行并在自己的局部变量上执行自己的计算,returning 单个值,或call routine
returning 多个值)。所以你可以用FCMP
函数替换你的宏函数,假设你是 运行ning 9.3 或更新版本。DOSUBL
DOSUBL 是一种要求 SAS 运行 完全在幕后执行宏的方法,这将允许您或多或少地做您想做的事情。RUN_MACRO
inFCMP
这几乎可以直接与您正在做的事情一起工作:您只需将宏包装在FCMP
函数中,使用RUN_MACRO
来调用它。就简单性而言,这可能是您最好的选择。
有关宏函数的更多阅读,sascommunity.org has a page on the subject 链接到很多论文;或在搜索引擎或 LexJansen.com 上查找有关编写宏函数的论文。