我正在尝试将此宏的值传递给 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
答案 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)
你有几个问题。
%MEND的名称需要与宏名称相匹配(get_expression与get_data)
您实际上并未创建任何输出或宏变量。输出进入ODS窗口。您可以通过选择以下内容来修改代码:创建宏变量,但您需要确保知道名称并分配正确的范围(本地/全局)。但是你试图将宏用作函数 - 它不是。 PROC FCMP旨在构建函数,这看起来很像查找表。
我就是这样做的,它在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。