首先,我有如下表:
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)的意见。
这是为什么不工作?
你需要用双引号引用宏变量的时候。
目前代码
%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”,这将返回根据您的输入结果。
通过宏的签名前面的答案,通过“在”和“出”的只是一个简单的重写
%macro sqlgrp(in=, id=, out=);
proc sql noprint;
create table &out. as select * from &in. where id = "&id.";
quit;
%mend sqlgrp;