楼主: dxystata
618 6

[问答] 为什么用qscan会出错 [推广有奖]

版主

大师

34%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
182749 个
通用积分
15207.5291
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
291935 点
帖子
5391
精华
1
在线时间
13496 小时
注册时间
2006-6-21
最后登录
2024-5-8

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

15论坛币
  1. %macro aaa(xvars=);

  2. data class;
  3.         set sashelp.class;
  4. run;

  5. %local i;
  6. %let i=1;
  7. %do %until (%qscan(&xvars,&i,' ')=);
  8.         %let xvar=%qscan(&xvars,&i,' ');
  9.             proc sql noprint;
  10.                         create table _&xvar as select distinct &xvar from temp0;
  11.                 quit;
  12.         %let i=%eval(&i+1);
  13. %end;

  14. %mend;

  15. %aaa(xvars=sex);
复制代码



为什么用qscan会出错?谢谢!

关键词:scan Distinct proc sql SASHELP Select
沙发
whymath 发表于 2022-7-11 21:59:33 |只看作者 |坛友微信交流群
宏函数在使用时,其参数不需要使用引号包围。因为在宏当中,变量没有类型,或者说,都是字符类型。因此宏函数也就不再需要区分其参数是字符还是数字,引号就不被需要了。
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 1 + 1 热心帮助其他会员

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

藤椅
dxystata 发表于 2022-12-13 00:19:09 |只看作者 |坛友微信交流群
whymath 发表于 2022-7-11 21:59
宏函数在使用时,其参数不需要使用引号包围。因为在宏当中,变量没有类型,或者说,都是字符类型。因此宏函 ...
如何修改呢?谢谢!

使用道具

板凳
dxystata 发表于 2022-12-14 15:27:19 |只看作者 |坛友微信交流群
  1. %macro aaa(xvars=);

  2. data class;
  3. set sashelp.class;
  4. run;

  5. %local i;
  6. %let i=1;
  7. %do %until (%scan(&xvars,&i,' ')=);
  8. %let xvar=%scan(&xvars,&i,' ');
  9. proc sql noprint;
  10.   create table _&xvar as select distinct &xvar from class;
  11. quit;
  12. %let i=%eval(&i+1);
  13. %end;

  14. %mend;

  15. %aaa(xvars=sex);
复制代码


用%scan不报错

使用道具

报纸
whymath 发表于 2022-12-16 00:42:42 |只看作者 |坛友微信交流群
dxystata 发表于 2022-12-14 15:27
用%scan不报错
去掉引号亦可。宏语句中,引号失去了引用的作用,单纯作为一种字符存在。

使用道具

地板
dxystata 发表于 2022-12-20 10:40:43 |只看作者 |坛友微信交流群
whymath 发表于 2022-12-16 00:42
去掉引号亦可。宏语句中,引号失去了引用的作用,单纯作为一种字符存在。
  1. %macro aaa(xvars=);
  2. data class;
  3.         set sashelp.class;
  4. run;

  5. %local i;
  6. %let i=1;
  7. %do %until(%qscan(&xvars,&i,)=);
  8. %let xvar=%qscan(&xvars,&i,);
  9.         proc sql noprint;
  10.                 create table _&xvar as select distinct &xvar from class;
  11.         quit;
  12. %let i=%eval(&i+1);
  13. %end;

  14. %mend;

  15. %aaa(xvars=sex);
复制代码
还是有错

使用道具

7
whymath 发表于 2022-12-20 11:55:42 |只看作者 |坛友微信交流群
dxystata 发表于 2022-12-20 10:40
还是有错
应改为使用%scan函数,之前提及的引号问题,实属跑偏了,抱歉。
我的理解是这样的:%qscan() 函数会屏蔽 & 符号,直到执行代码时才进行解析,而此时 SQL 代码由于 %qscan() 还未解析,编译过程就失败了,因此报错。具体地,SAS代码的编译、执行过程是这样:
宏编译  →  宏执行  →  普通程序编译  →  普通程序执行

%qscan() 的执行在第四步。
proc sql的编译在第三步,此时的程序为 create table _%qscan(&xvars,&i,)  as ...,由于 %qscan() 尚未解析为 sex,编译工作出错了,编译器报告错误,程序中止。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-9 08:36