sas宏(2),运行中创建宏与使用宏,proc sql创建宏, scl中宏处理(暂缺)

1:在程序运行中进行宏定义

CALL routines that enable you to transfer information between an executing DATA step and the macro processor.

You can use the SYMPUT routine to create a macro variable and to assign to that variable any value that is available in the DATA step.

When you use the SYMPUT routine to create a macro variable in a DATA step, the macro variable is not actually created and assigned a value until the DATA step is executed.

options symbolgen pagesize=30;
%let crsnum=3;
data revenue;
set sasuser.all end=final;
where course_number=&crsnum;
total+1;
if paid=‘Y‘ then paidup+1;
if final then do;
    if paidup<total then do;
        call symput(‘foot‘,‘Some Fees Are Unpaid‘);     /*symput函数能达到运行时给宏赋值的效果*/
        /*%let foot=Some Fees Are Unpaid; */ /*使用let不能达到想要的效果,let会被宏处理器先执行,优先于data步*/
    end;
    else do;
        call symput(‘foot‘,‘All Students Have Paid‘);
        /*%let foot=All Students Have Paid;*/
    end;
end;
run;

symput函数里面的参数为表达式的情况

里面引用的函数不需要使用%这种宏函数的记号

trim去右尾 left去左尾

call symput(‘numpaid‘,trim(left(paidup))); 

依据变量名建立宏

data _null_;
set sasuser.courses;
call symput(course_code, trim(course_title));/*每一个observation中的两个变量分别对于宏值与宏变量*/
run;
%put _user_;

多个宏触发器的扫描规则

宏处理器将两个&当做一个看待,所以第一次扫描&&&lv2被处理成&(&lv2)->&lv1,第二次扫描就得出res

而&&lv2第一次扫描被处理成&lv2,结果依然为lv1

/*想要用lv2来得到res*/data _null_;
%let lv1 = res;
%let lv2 = lv1;
%put &lv2; /*一个红触发器无须解释,结果为lv1*/
%put &&lv2; /*这个看上去有理,但是得出的结果还是lv1*/
%put &&&lv2;/*这个得出的结果为res*/
run;

2:在程序运行中进行宏值得获取

在程序中进行宏值得获取用&是不行的,这个是在编译前就被执行的语句。

data teachers;
set sasuser.register;
length Teacher $ 20;
teacher=symget(‘teach‘||left(course_number));
run;

3:利用proc sql创建宏

/*在行数位置的情况下创建多个宏变量*/proc sql noprint;
    select count(*) into :numrows
        from sasuser.schedule
        where year(begin_date)=2002;
%let numrows=&numrows; /*消除首尾空白*/
%put There are &numrows courses in 2002;
    select course_code, location,
            begin_date format=mmddyy10.
        into :crsid1-:crsid&numrows,
             :place1-:place&numrows,
             :date1-:date&numrows
        from sasuser.schedule
        where year(begin_date)=2002
        order by begin_date;
%put _user_;
quit;

create one macro variable that will hold all values of a certain data set variable.

proc sql noprint;
    select distinct location into :sites separated by ‘ ‘
        from sasuser.schedule;
quit;

 Global Symbol Table(符号表中,宏与宏值)
Sites Boston Dallas Seattle

Proc sql中不会进行自动的数据类型转换。对于你想要使用的数据类型要进行手动转换

时间: 2024-11-10 10:51:09

sas宏(2),运行中创建宏与使用宏,proc sql创建宏, scl中宏处理(暂缺)的相关文章

转发:使用sql命令查询视图中所有引用的基础表

转自:使用sql命令查询视图中所有引用的基础表 使用sql命令查询视图中所有引用的基础表 之前有写过如何利用sql查询视图中所有引用的表发现这个方法并不能查出视图中所有的基础表,如果视图中有嵌套视图就会有问题,因为目录视图sys.sql_dependencies并不包含所有的引用实体.后面发现在sql2008及以后的版本中推出的sys.sql_expression_dependencies视图解决了这一问题,所以重新写了段sql,用来查询视图中所有引用的基础表,包括嵌套视图中的基础表.这个有什么

&lt;28&gt;【了解】10-枚举类型介绍及定义+【掌握】11-枚举变量变量定义和使用+【掌握】13-typedef定义新的类型+【掌握】15-宏的概念及无参宏定义方法+【掌握】16-有参宏定义和使用方法+【掌握】17-应用:使用有参宏求最大值+【掌握】18-typedef和#define的区别

[了解]10-枚举类型介绍及定义 枚举类型: C语言提供了一个种类型,这种类型的变量的取值被限定在一定的范围之内了 枚举类型的定义: enum 枚举类型名{ 枚举值1,枚举值2,.... }; 举例: 定义一个变量,保存一周的第几天 enum weekday{ zhouyi,zhouer,zhousan,zhousi,zhouwu ,zhouliu,zhouri }; 定义iPhone手机的颜色 关于枚举类型元素的命名习惯 enum iColor{kIcolorWhite,kIcolorBlac

理解统计信息(3/6):谁创建和管理统计信息?在性能调优中,统计信息的作用。

在理解统计信息(2/6):直方图 中,我们讨论了直方图,密度,还有SQL Server如何用统计信息做基数预估(cardinality estimation).这篇文章会讨论统计信息如何被创建,还有统计信息在性能调优中的重要性. 有2类统计信息,索引统计信息和列统计信息.索引统计信息是索引创建的一部分(建立索引会自动创建索引统计信息).在where条件列被引用或查询的group by子句里包含列,列统计信息都会由SQL Server自动创建. 有数据库属性设置里,可以设置数据库是否自动创建统计信

[转载]mysql创建临时表,将查询结果插入已有表中

今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取.我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时表在内存之中,读取速度应该比视图快一些.然后还需要将查询的结果存储到临时表中.下面是创建临时表以及插入数据的例子,以供大家参考. A.临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表:1)定义字段  CREATE TEMPORARY TABLE tmp_table (      name VARCHAR(10)

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=

SQLserver中的视图与主外键的创建

一.背景 原来学过数据库的相关内容,只是形式上的,从来也没有实践过,徐徐飘过而已,如今在做机房时,很多知识需要用到视图,才开始去慢慢的实践. 视图:我理解的就是一张表,它把我们所需要的某个表或某几个表中的部分信息提取出来,形成了一张临时的表. 它主要有两个优点:1.简单,它呈现给我们的数据就是我们想要的数据,没有多余的. 2.安全,提供给用户它们权限范围内的数据 我为什么会用到视图?举一个简单的例子,在查询用户信息时,我们可能会用到两张表中的内容.那么这个时候我就需要将两张表中我需要的数据提取出

Nodejs express中创建ejs项目,解决express下默认创建jade,无法创建ejs问题

最近在看<Node.js开发指南>,看到使用nodejs进行web开发的时候,准备创建ejs项目遇到问题了, 书上命令为: ? 1 express -t ejs microblog 可是执行后,仍旧创建的是jade项目. 原来,express3.x,express4.x中创建ejs命令更新为: express -e microblog //即ejs,-j(即jade)  当然,最直接的,你也可以修改package.json里的定义来实现安装ejs. PS:建立工程过程 1.必须得安装expre

SQL Server R2 2008中的SQL Server Management Studio 阻止保存要求重新创建表的更改问题的设置方法

在2008中会加入阻止保存要求重新创建表的更改这个选项.症状表现为修改表结构的时候会"阻止"你. SQL Server 2008“阻止保存要求重新创建表的更改”的错误的解决方案是本文我们主要要介绍的内容,情况是这样的:我们在用SQL Server 2008 建完表后,插入或修改任意列时,提示:当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成表的更改. 如果强行更改会出现以下提示:不允许保存更改.您所做的更改要求删除并重新

11_Eclipse中演示Git版本的创建,历史版本的修改,创建分支,合并历史版本和当前版本

?? 1 执行以下案例: 某研发团队2011年初开发了一款名为Apollo的信息系统,目前已发布v1.0版本.此项目初期已有部分基础代码, 研发团队再此基础代码上经过3个月的努力发布了一个功能相对完备的Apollo 1.0版本进行销售. 由于销售业绩良好,因此研发团队正在着手v2.0版本的开发工作. 但就在这个时候,有客户发现v1.0软件系统一严重bug,如不及时修复将造成严重后果. 研发团队收到bug报告后立刻安排部分研发人员对v1.0版本进行修复,但其他研发人员则继续开发v2.0版本的新功能