SAS是否提供内置宏格式化自定义DI转换的输出?
在SAS Data Integration (DI) Studio开发ETL程序时,自带的每个转换都有简洁的UI,能直接设置输出数据集的列名、类型、长度和格式。但遇到现有转换满足不了需求,必须写自定义代码的时候,我们得尽量保留点选式的配置界面——毕竟后续维护人员大多不会深入底层SAS代码,修改列或格式时,他们更希望直接通过UI配置完成,而且这样还能支持影响分析与反向影响分析。
我之前为了实现这个需求,会用SAS暴露的输出结构宏变量写一个自定义宏,像这样:
%macro format_output(data); %do _col = 0 %to &&&data._col_count - 1; length &&&data._col&_col._name &&&data._col&_col._type&&&data._col&_col._length; %if %length(&&&data._col&_col._format) %then %do; format &&&data._col&_col._name &&&data._col&_col._format; %end; %end; %mend; data &_OUTPUT1 (keep=&_OUTPUT1_keep); %format_output(_OUTPUT1); set &_INPUT1; * actual code ; run;
现在想问问:SAS有没有提供内置宏或类似工具,能实现和这个自定义宏一样的功能?
补充说明:SAS是通过这类宏变量来披露输出结构的:
%let _OUTPUT1 = myLib.myTable; %let _OUTPUT1_connect = ; %let _OUTPUT1_engine = ; %let _OUTPUT1_memtype = DATA; %let _OUTPUT1_opt...
好问题!其实SAS确实有内置的解决方案来做这件事,不用自己写宏——就是**%DSTOOLS_FORMAT_OUTPUT**宏,它是SAS DI Studio自带的工具宏,专门用来处理这种从DI配置的元数据生成输出列结构的需求。
这个宏会自动读取DI Studio暴露的那些输出数据集相关的宏变量(比如你提到的&_OUTPUT1_col_count、&_OUTPUT1_colX_name这类),自动生成对应的length和format语句,完全替代你自定义的%format_output宏的功能。
用法也很简单,直接在你的data步里调用就行,比如把你的代码改成:
data &_OUTPUT1 (keep=&_OUTPUT1_keep); %DSTOOLS_FORMAT_OUTPUT(_OUTPUT1); set &_INPUT1; * actual code ; run;
另外,还有个小细节:如果你的自定义转换涉及多个输出数据集,这个宏也能处理,只要把对应的输出标识(比如_OUTPUT2)传给它就行。
这个宏的优势在于它是SAS官方维护的,会随着DI Studio的版本更新而适配,比自己写的宏更稳定,而且完全兼容DI的影响分析功能——维护人员通过UI修改列配置后,宏会自动读取更新后的元数据变量,不用手动调整代码。
对了,还有个相关的宏**%DSTOOLS_ATTRIB_OUTPUT**,它会生成attrib语句来定义列的属性,效果和你写的length加format类似,你也可以根据需求选择使用。
内容的提问来源于stack exchange,提问作者Dirk Horsten

