宏功能将输出分配给宏变量

时间:2017-10-25 17:22:34

标签: sas sas-macro

我正在尝试将此宏的值传递给 output 宏变量

%Macro Get_expression(tablename,code);
    proc sql;
        select Sql_expression
        From &tablename.
        where Cod = &code.;
    quit;
run;
%MEND Get_data;

*Print the macro

%let output=%Get_expression(dtvault.parameterjobs,'DO_M_R_C');
%put &output;

但我遇到此错误

NOTE: Writing TAGSETS.SASREPORT13(EGSR) Body file: EGSR
24         
25         GOPTIONS ACCESSIBLE;
26         %Macro Get_expression(tablename,code);
27             proc sql;
28              select Sql_expression
29              From &tablename.
30              where Cod = &code.;
31          quit;
32         run;
33         %MEND Get_data;
WARNING: Extraneous text on %MEND statement ignored for macro definition GET_EXPRESSION.
34         
35         *Calling a Macro program;
36         %let output=%Get_expression(dtvault.parameterjobs,'DO_M_R_C');
NOTE: Line generated by the invoked macro "GET_EXPRESSION".
36         proc sql;   select Sql_expression   From &tablename.   where Cod = &code.;  quit; run;
                       ______
                       180
ERROR 180-322: Statement is not valid or it is used out of proper order.


37         %put &output;

我做错了什么?

如果只运行此

%Get_expression(dtvault.parameterjobs,'DO_M_R_C'); 

标签结果显示正确的查询结果

谢谢,G.O

3 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您正在寻找select into声明。这是一个例子:

proc sql noprint;
    select "'" || strip(name) || "'" /*format=*/ into :name_list separated by ", "
    from sashelp.class;
quit;
%put &name_list.;

请记住,SAS宏变量始终是文本。这就是格式化的原因。

答案 1 :(得分:0)

你有几个问题。

  1. %MEND的名称需要与宏名称相匹配(get_expression与get_data)

  2. 您实际上并未创建任何输出或宏变量。输出进入ODS窗口。您可以通过选择以下内容来修改代码:创建宏变量,但您需要确保知道名称并分配正确的范围(本地/全局)。但是你试图将宏用作函数 - 它不是。 PROC FCMP旨在构建函数,这看起来很像查找表。

  3. 我就是这样做的,它在SASHELP.CLASS数据集中查找一个人的重量。

    %macro get_data(tablename=, name=, output_name=);
         data _null_;
              set &tablename.;
              where name= &name. ;
              call symputx("&output_name.", weight, 'g');
         run;
    %mend;
    
    %get_data(tablename=sashelp.class, name='Alfred', output_name=myVar);
    %put &myVar;
    

答案 2 :(得分:0)

宏只生成文本。在您的情况下,它生成的文本的开头是

%LET

所以当你在另一个语句中使用它时,比如你的%let output=%Get_expression(dtvault.parameterjobs,'DO_M_R_C'); 语句

%let output=proc sql; select Sql_expression

宏调用被生成的文本替换。因此,您最终会得到SAS现在需要评估的代码。

%LET

第一个分号标志着proc sql语句的结束。因此宏变量OUTPUT的值为SELECT。并且zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*'语句无效,因为您从未真正启动过PROC SQL。