SAS-异常排查Q&A

Q0.SAS和SAS eg的帮助文档,可以解决90%问题

https://documentation.sas.com/?activeCdc=egdoccdc&cdcId=egcdc&cdcVersion=8.1&docsetId=egug&docsetTarget=p120m0y084zc3ln136lcseq41alx.htm&locale=zh-CN

Q1.平时经常使用的宏变量

A1.定义方法有三种:
%let xxx=yyy;
Call Symput(‘xxx’,‘yyy’);
select xxx into: yyy.
三种定义方式最大的区别是在MACRO函数内定义所生成的宏变量的类型不同:
Call Symput在宏函数中定义的宏变量可以在函数外调用;而%let和 Select into则不能,因为这2种方法在MACRO函数内生成的是局部宏变量,若要想在MACRO函数外调用,需事先用%global申明变量类型。

%macro test();
/*Method 1*/
data _NULL_;
call symput('Today',put(today(),date9.));
run;

/*Method 2*/
%let today=%sysfunc(today(),date9.);

/*Method 3*/
data todaydate;
date=today();
Proc sql noprint;
select put(date,date9.) INTO: today
from todaydate;
quit;

%put &today;
%mend;
%test;
%put &today;

来自https://zhidao.baidu.com/question/1642728095170651860.html

Q2.用bat执行sas文件不成功

A2.bat文件执行条件:
1.不能加密
2.同一条语句不能换行

"D:\Program Files\SASHome2\SASFoundation\9.4\sas.exe"  -sysin "C:\Users\**\Desktop\SAS脚本\每日自动\贷前客户画像.sas"   -log "C:\Users\**\Desktop\SAS脚本\每日自动\贷前客户画像.log" -CONFIG "D:\Program Files\SASHome2\SASFoundation\9.4\nls\zh\sasv9.cfg"

3.一个bat调用多个bat

start C:\Users\**\Desktop\SAS脚本\每日自动\111.bat exit
start C:\Users\**\Desktop\SAS脚本\每日自动\222.bat exit
start C:\Users\**\Desktop\SAS脚本\每日自动\333.bat exit

Q3.ERROR: 值“ ”是无效的 SAS 名。不识别中文变量名

A3.解决方案:options validvarname=any;

Q4.WARNING: 连接逻辑库“SASHELP”中指定的一个或多个逻辑库不存在。这些逻辑库已从连
WARNING: 接中删除。

A4.解决方案:新建文件夹SASCFG 建立路径如下:
盘:\SASHome\x86\SASFoundation\9.4\nls\en
盘:\SASHome\x86\SASFoundation\9.4\nls\zh
建立后结果:
盘:\SASHOME\x86\SASFoundation\9.4\nls\en\SASCFG
盘:\SASHOME\x86\SASFoundation\9.4\nls\zh\SASCFG

来自 https://bbs.pinggu.org/thread-5896458-1-1.html

Q5.ERROR: 执行错误: Data too long for column ‘发放季度’ at row 1

A5.解决方案1:在SAS中新建一个满足column '发放季度’字段长度的表,再将其复制到mysql中
解决方案2:LENGTH
DATA month_fir_ovd;
LENGTH '发放季度’n $ 500;
SET month_fir_ovd;
RUN;

Q6.ERROR: 字符表达式要求字符输出格式。

A6.解决方案1:INPUT(SUBSTR(createdate,1,10),YYMMDD10.) FORMAT YYMMDD10. AS 执行日期,FORMAT在 AS 前还是后都可以
解决方案2:time=input(put(date,yymmn6.),yymmn6.)

Q7.日期互换

A7.PUT(dd_date,YYMMN6.) accdate=INPUT(accdate,YYMMDD10.) INPUT(substr(accdate,1,10),yymmdd10.)/用这个,也不一定行/ INPUT(SUBSTR(app_num,3,8),yymmdd10.)
PUT(A.create_time,YYMMDDN8.) 为YYYYMMDD
INPUT(STERM, BEST.)文本转数值

Q8.ERROR: 日期值越界

A8.需要加上DATEPART()

Q9.给代码加注释

Q9.良好的代码习惯

*---------------------------------------------------*
| PURPOSE: ***
| PROGRAMMER: abc
| DATE: 2019-08-26
| REMARK:
|
*---------------------------------------------------*;
分段
*------------------------------------------------------------------------------------------------------*
/*1.*************************;
*------------------------------------------------------------------------------------------------------*;

Q10.week周函数

A10.weeku=week(date,“u”),表示把每周的Sunday当作一周的开始,并且新一年的前几天和上一年在同一周,则新一年前几天按照0周看待,上一年的后几天当作52周;
weekv=week(date,“v”),表示把每周的Monday当作一周的开始,并且新一年的前几天和上一年在同一周,则新一年前几天和上一年的后几天当作53周;
weekw=week(date,“w”),表示把每周的Monday当作一周的开始,并且新一年的前几天和上一年在同一周,则新一年前几天按照0周看待,上一年的后几天当作52周;

Q11.添加序号

A11._N _

Q12.TRANSPOSE转置/固定符号拆分

A12.双ID作为字段名

PROC TRANSPOSE DATA=上下限_20181116_汇总 OUT=上下限_20181116_汇总 delimiter=_;
BY 业务品种 业务类型 客户类型 客户评级 机构 版本;
VAR COL1;
ID 借款主体 _NAME_;
RUN;

/*固定符号拆分*/
proc transpose data=risk_all out=spec_risk_1  prefix=spec_risk;
by app_num;
var spec_risk;
data spec_risk;
set spec_risk_1;
spec_risk=catx('@',of spec_risk1-spec_risk6);
run;

Q13.太慢

建立索引

PROC SQL;
create unique index studentID on class(studentID);
quit;


PROC SQL;
create index app_num on zrb_tag(app_num);
quit;

Q14.scan(string,i,“char”)

A14.表示从字串string中以char为分隔符提取第i个字串,eg:scan(‘2011-09-01 14:20:31’,1,’ '),

Q15.报错终止程序

A15.

%if &SYSERR > 6 %then %goto STOPLOG

Q16.SAS数据集取前N条记录

A16.

proc sql outobs=n
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值