如何访问 SAS 用户定义函数中的表值?

问题描述 投票:0回答:2

我正在创建一个函数来返回 SAS EG 中的每月工作日编号。我可以使用 weekday() 找到周末,但我还需要考虑银行假日。我们有一个银行假期表,我尝试了几种方法来使该函数能够读取银行假期表并返回当月已经过去的银行假期数。

本质上,我需要一种从函数内执行 SQL 并从 SQL Select 语句返回 2 个值的方法。我有使用 Select into 的 SQL,它可以工作。如何将这些值返回到函数中的代码?

sql sas
2个回答
4
投票

Proc FCMP 没有执行 SQL 查询的功能。

您可以使用 FCMP 函数 READ_ARRAY() 将数据集列拉入您的自定义函数中。

示例:

proc fcmp outlib = work.so.example;

   function example() ;
     array nvalues[100, 5] / nosymbols;
     rc = read_array('sashelp.class', nvalues, 'age', 'weight');

     put nvalues;

     return (0);
   endsub;

run;

options cmplib=work.so;

data _null_;;
  z = example();
  put z=;
run;

将从 sashelp.class 记录年龄和体重

14 112.5 13 84 13 98 14 102.5 14 102.5 12 83 12 84.5 15 112.5 13 84 12 99.5 11 50.5 14 90 12 77
15 112 16 150 12 128 15 133 11 85 15 112
z=0


0
投票

您可以让 PROC FCMP 运行宏,并将一个或多个值返回给 FCMP 函数。该宏的运行完全独立于代码中的调用位置,因此您可以在 datastep 函数内运行 SQL。

这被称为“宏函数三明治”,几篇 SAS SUGI 论文更详细地介绍了它。

%宏 FCMP_BANKHOL ;
  /* startDT和endDT是从FCMP传入的,NUM_BH是传回来的 */
  %LET NUM_BH = -1 ; /* SQL失败时的默认值 */
  过程 SQL ;
    选择 count(1) 到 :NUM_BH 中
    来自工作班霍尔斯
    其中 &startDT 和 &endDT 之间的日期
    ;
  辞职 ;
%修复;

选项 cmplib=work.helpers ;
proc fcmp outlib=work.helpers.bankhol ;
  函数 getBankHols(startDT, endDT) ;
    rc = run_macro('FCMP_BANKHOL',startDT, endDT, NUM_BH) ;
    返回(NUM_BH);
  结束子;
辞职 ;

数据银行;
  输入日期:date9。 ;
  格式 日期 date9. ;
数据线;
2022年12月25日
2022年12月26日
2023年1月1日
;
跑步 ;

/* 用法示例 */
数据_空_;
  num_bh = getBankHols('01jan2023'd,'31jan2023'd) ;
  把 num_bh= ;
  num_bh = getBankHols('01dec2022'd,'31dec2022'd) ;
  把 num_bh= ;
跑步 ;

/* 或者通过 %SYSFUNC ... */
%LET NUM_BH = %SYSFUNC(getBankHols('01jan2023'd,'31jan2023'd)) ;
%PUT&NUM_BH;
© www.soinside.com 2019 - 2024. All rights reserved.