我有一个名为mylib.common_noun的表,其中包含大约2000条记录,不过这个值可以每两周更改一次。我正在尝试生成与mylib.common_noun中的记录计数相同数量的union语句
mylib.common_noun的结构。两列:关键字和dname
Keywords DNAME
A sas1
B sas2
C sas3例如,假设mylib.common_noun包含3条记录,那么它应该基于变量dname生成union语句,然后运行以下代码
proc sql;
create table mylib.test_union as (select * from mylib.sas1
union
select * from chug.sas2
union
select * from chug.sas3);quit;我根据建议运行了以下代码,但它不起作用。
filename code temp;
data _null_;
file code;
set mylib.common_noun;
if _n_>1 then
put 'create table mylib.test_union as';
else put 'union '@;
put 'select * from ' dname;
run;
proc sql;
OPTIONS SOURCE2;
%include code;
;
quit;日志中的错误:
40 %include code;
NOTE: %INCLUDE (level 1) file CODE is file
41 +union select * from mylib.sas_out1
_____
180
ERROR 180-322: Statement is not valid or it is used out of proper order.
42 +create table mylib.test_union as
43 +select * from mylib.sas_out2
44 +create table mylib.test_union as
45 +select * from mylib.sas_out3不确定如何让它工作
发布于 2019-09-10 23:46:27
听起来你需要从数据中生成代码。虽然您可以使用宏逻辑生成代码,但只使用常规SAS语句生成代码可能会更容易。
您没有描述DATASET的结构,所以让我们假设它有一个名为chug.claimants的变量,其值类似于"chug.sas_claimants2“。如果不是,那么只需添加一些逻辑,以便从它所具有的变量创建这样的值。
filename code temp;
data _null_;
file code ;
set chug.claimants ;
if _n_=1 then put 'create table chug.test as' ;
else put 'union ' @ ;
put 'select * from ' dataset ;
run;
proc sql ;
%include code ;
;
quit;不确定PROC SQL代码是否是生成的最佳代码。为什么不直接生成一个SET语句呢?
filename code temp;
data _null_;
file code ;
set chug.claimants ;
if _n_=1 then put 'set ';
put dataset ;
run;
data chug.test ;
%include code ;
;
run;您也可以使用call execute()来生成代码,但是这样就没有办法在生成和执行阶段之间停下来检查生成的代码。或者利用PUT语句的报告编写功能。
https://stackoverflow.com/questions/57873526
复制相似问题