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

这不是你想要的,对吧。

您有多种方法可以解决这个问题。

  1. PROC FCMP PROC FCMP 是 SAS 函数编写语言。 PROC FCMP 确实 或多或少地编写了真正的函数 - 'less' 是它们实际上并不比它们包含的代码更有效,这与其他语言相反,但它们确实如此否则像 C 类型函数一样工作(它们完全在幕后运行并在自己的局部变量上执行自己的计算,returning 单个值,或 call routine returning 多个值)。所以你可以用 FCMP 函数替换你的宏函数,假设你是 运行ning 9.3 或更新版本。

  2. DOSUBL DOSUBL 是一种要求 SAS 运行 完全在幕后执行宏的方法,这将允许您或多或少地做您想做的事情。

  3. RUN_MACRO in FCMP 这几乎可以直接与您正在做的事情一起工作:您只需将宏包装在 FCMP 函数中,使用 RUN_MACRO 来调用它。就简单性而言,这可能是您最好的选择。


有关宏函数的更多阅读,sascommunity.org has a page on the subject 链接到很多论文;或在搜索引擎或 LexJansen.com 上查找有关编写宏函数的论文。