首先我有下表:
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;
Run Code Online (Sandbox Code Playgroud)
我想编写一个宏,以便用户可以通过给出id值来对数据进行子集化.我在宏内部执行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*/
Run Code Online (Sandbox Code Playgroud)
我能够在WORK库中生成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*/
Run Code Online (Sandbox Code Playgroud)
查找的值id是字面上的 "&ID.".您可以通过创建此数据集来测试它:
data dataset;
input id $ value;
datalines;
&id. 2
A 2
;
run;
Run Code Online (Sandbox Code Playgroud)
现在,用于%let设置宏变量的值id:
%let id=A;
Run Code Online (Sandbox Code Playgroud)
快速测试单引号和双引号之间的功能差异.请注意,标题还包含单引号和双引号,因此我们可以准确地看到输出中发生了什么:
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;
Run Code Online (Sandbox Code Playgroud)
正确的代码
%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*/
Run Code Online (Sandbox Code Playgroud)
双引号允许宏变量&id解析为'A',它将根据您的输入返回结果.
| 归档时间: |
|
| 查看次数: |
14022 次 |
| 最近记录: |