SAS:使用宏运行SQL查询

SAS:使用宏运行SQL查询,sas,sas-macro,proc-sql,Sas,Sas Macro,Proc Sql,使用thread提供的答案,我试图使用以下代码。我在一个表中有一个sql查询列表,每个查询都有一个id。现在我想把这些查询的结果加上id作为另一个表 /* The Macro */ %macro run_query(q,id); proc sql noprint; select count into: count from (&q.) a; quit; %mend; /* Some fake-data */ DATA queries; INPUT id

使用thread提供的答案,我试图使用以下代码。我在一个表中有一个sql查询列表,每个查询都有一个id。现在我想把这些查询的结果加上id作为另一个表

/* The Macro */
%macro run_query(q,id);
  proc sql noprint;
      select count into: count
      from (&q.) a;
  quit;
%mend;

/* Some fake-data */
DATA queries;
INPUT id :$12. query :$3000.;
INFORMAT id $12.;
INFILE DATALINES DSD;
DATALINES;
01,SELECT COUNT(*) AS count FROM sashelp.bweight WHERE Married=1
0101,SELECT COUNT(*) AS count FROM sashelp.bweight WHERE Boy=1
0102,SELECT COUNT(*) AS count FROM sashelp.bweight WHERE Black=1
;
RUN;

/* Make a copy of the dataset */
DATA want;
SET queries;
RUN;

/* Insert the results */
data want;
set queries;
call execute(%nrstr(%run_query('||query||','||id||')));
run;
有人能看出问题出在哪里吗?错误报告如下所示:


在第/*部分插入结果*/您基本上是通过数据步骤将所有值/结果发送到dev null中:

data _null_;
相反,请尝试:

data want;

第二部分你可以试试这个

在宏中使用proc sql提取计数,并使用变量count1、count2、count3构建数据集

       %macro a;
    proc sql;
    select count(*) into :count1 FROM sashelp.bweight WHERE Married=1;
    SELECT COUNT(*) into :count2 FROM sashelp.bweight WHERE Boy=1;
    SELECT COUNT(*) into :count3 FROM sashelp.bweight WHERE Black=1;
    quit;

    DATA queries;
    length id $12 query $3000;
    format id $12. query $3000.;
    infile datalines delimiter=','; 
    input id $ query $;
    datalines;
    01,&count1
    0101,&count2
    0102,&count3
    ;
    run;
  %mend a;

/*Call above maco*/
    %a;

谢谢不幸的是,这并没有多大改变,因为我仍然得到一个错误(见上图),显示实际日志(而不是摘要)中的行文本,以便您可以看到标记的代码。确保打开MPRINT选项,以便在日志中看到宏生成的代码。为什么宏有第二个输入?它没有被使用。我看不出您在哪里预先定义了目标宏变量计数。如果它不存在,它将位于宏的本地并消失。但您似乎在下一次调用时写得太多了。
execute()
接受字符串参数。您已经提供了开放代码。您是否可以尝试使用单引号而不是使用
%nrstr
引用它。此外,如果您提供SAS生成的完整日志,这将非常有用