%宏内部SAS PROC SQL(SAS proc sql inside %macro)

2019-10-21 08:29发布

首先,我有如下表:

data dataset;
    input id $ value;
    datalines;
    A 1
    A 2
    A 3
    A 4
    B 2
    B 3
    B 4
    B 5
    C 2
    C 4
    C 6
    C 8
    ;
run;

我想编写一个宏,使用户可以通过给id值子集的数据。 我PROC宏中的SQL如下:

%macro sqlgrp(id=,);

proc sql;
        create table output_&id. as
        select *
        from dataset
        where id = '&id.'
        ;
    quit;
%mend;

%sqlgrp(id=A); /*select id=A only*/

我能够产生工作库中的output_A表,但它具有零(0)的意见。

这是为什么不工作?

Answer 1:

你需要用双引号引用宏变量的时候。

目前代码

%macro sqlgrp(id=,);

proc sql;
        create table output_&id. as
        select *
        from dataset
        where id = '&id.'
        ;
    quit;
%mend;

%sqlgrp(id=A); /*select id=A only*/

查找值id字面上 “&ID。”。 您可以通过创建该数据集的测试:

data dataset;
    input id $ value;
    datalines;
&id. 2
A    2
    ;
run;

现在,使用%let来设置宏变量的值id

%let id=A;

跑单引号和双引号之间的功能差异的快速测试。 注意标题中还含有单,双引号,所以我们可以看到正是在输出已经发生:

proc sql;
  title 'Single Quotes - where id=&id.';
  select *
  from dataset
  where id='&id.';

  title "Double Quotes - where id=&id.";
  select *
  from dataset
  where id="&id.";
  title;
quit;

正确的代码

%macro sqlgrp(id=,);

proc sql;
        create table output_&id. as
        select *
        from dataset
        where id = "&id."
        ;
    quit;
%mend;

%sqlgrp(id=A); /*select id=A only*/

双引号允许宏变量&ID解析为“A”,这将返回根据您的输入结果。



Answer 2:

通过宏的签名前面的答案,通过“在”和“出”的只是一个简单的重写

%macro sqlgrp(in=, id=, out=);
   proc sql noprint;
      create table &out. as select * from &in. where id = "&id.";
   quit;
%mend sqlgrp;


文章来源: SAS proc sql inside %macro