繁体   English   中英

在SQL语句中执行宏

[英]Execute Macro inside SQL statement

情况:

我有一个带有两列的表mytabletablenametablefield

|-----------|------------|
| tablename | tablefield |
|-----------|------------|
| table1    | id         |
| table2    | date       |
| table3    | etc        |
|-----------|------------|

我的核心目标基本上是为每个表名进行Select ,以显示其对应表字段的MAX()值。

Proc SQL;
Select MAX(id) From table1;
Select MAX(date) From table2;
Select MAX(etc) From table3;
Quit;

ps:解决方案必须从表中提取数据,因此无论表是否更改其值,解决方案也将进行更改。

我试过的

从我的大多数尝试中,这是最复杂的,我认为离解决方案最近的是:

proc sql;
create table table_associations (
    memname varchar(255), dt_name varchar(255)
);

Insert Into table_associations 
values ("table1", "id")
values ("table2", "date")
values ("table3", "etc");
quit;

%Macro Max(field, table);
Select MAX(&field.) From &table.;
%mend;

proc sql;
Select table, field, (%Max(field,table))
From LIB.table_associations
quit;

创建宏后,我的意图很明确,但是对于此示例,我应该解决2个问题:

  • SQL语句中执行宏;
  • 使宏将其String值参数理解为SQL命令。

在数据步骤中,您可以使用call execute来执行您要描述的事情。

%Macro Max(field, table);
proc sql;
Select MAX(&field.) From &table.;
quit;
%mend;

data _null_;
    set table_associations;
    call execute('%MAX('||field||','||table||')');
run;

这里不需要宏,因为您可以在数据步骤中使用put语句生成代码:

filename gencode temp;

data _null_;
  set table_associations end=eof;
  file gencode;
  if _n_=1 then put 'proc sql;';
  put 'select max(' tablefield ') from ' tablename ';';
  if eof then put 'quit;';
run;

%include gencode / source2;
filename gencode clear;

该代码被写入名为“ gencode”的临时文件。 如果需要,可以将该文件永久化。 _n_=1end=eof用于在查询之前和之后打印语句。 最后, %include gencode运行的代码和source2选项打印代码到日志中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM