| 
 | 
板凳
 
 
 楼主 |
发表于 2003-11-3 11:14:51
|
只看该作者
 
 
 
sasprog问的是一个好问题。这两种方法在宏的应用中非常常见。 
 
bowl说的非常有道理:“赋值和取值的不同” 
 
1/ %let语句是global语句,在除DATATLINES外的任何地方可以出现,而在SAS BASE 中call sysput语句只能在data步中。另外call sysput也可出现在SCL。 
 
2/ %let只是单次赋值(Creates a macro variable and assigns it a value);而call sysput可以灵活得获取data中变量值生成(多个)宏变量,当然也可以单个赋值(Assigns (a) value/s produced in a DATA step to (a) macro variables)。 
如下面可生成宏变量POS1, POS2, POS3: 
data team2; 
   input position : $12. player $12.; 
   call symput('POS'||left(_n_), position); 
   cards; 
shortstp Ann 
pitcher Tom 
frstbase Bill 
; 
run; 
 
 
3/ 两者对结尾处的blank的处理也有所不同: 
data _null_; 
   call symput('TEST', 'SAS   '); 
run; 
 
%PUT **&TEST**; *retain trailing blank; 
 
data _null_; 
   call symput('TEST_SYMPUT', "&TEST"); 
; 
run; 
%LET TEST_LET =&TEST; 
 
%put **&TEST_SYMPUT**;  
%put **&TEST_LET**; 
 
结果 
8  %put **&TEST_SYMPUT**; 
**SAS   ** 
9  %put **&TEST_LET**; 
**SAS** 
 
4/ 两者产生的宏变量都是全局宏变量,这点和PROC SQL SELECT INTO不同。 
 
5/ call symput是在DATA步完成后才赋值的,这点需要小心。 
 
5/ 可能还有其它差别,请补充。 
 
与call symput对应的引用宏变量的方法是call symget,类似。 |   
 
 
 
 |