You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PROC FCMP函数中动态指定哈希对象的数据集名称

在FCMP函数中传递数据集参数给哈希对象声明

问题场景

需要将数据集名称作为输入参数传入FCMP函数,用于声明哈希对象。原代码中尝试直接使用参数dsn的语句无法运行:

function somefunction(dsn $, k1 $, k2 $, k3 $, k4 $);
  declare hash h(dataset: "work.someDatasetName");
  *declare hash h(dataset: dsn); /* 此语句报错 */
  rc = h.defineKey('k1', 'k2', 'k3', 'k4');
  rc = h.defineData('d1', 'd2', 'd3', 'd4', 'd5', 'd6');
  rc = h.definedone();
  rc = h.find();
endsub;

报错信息

163           declare hash h(dataset: dsn);
___
22
202
ERROR 22-322: Expecting a quoted string.
ERROR 202-322: The option or parameter is not recognized and will be ignored.

解决方案

根据SAS官方文档,哈希对象declare语句的dataset参数要求传入带引号的字符串(字面量或带引号的字符变量),而load方法的dataset参数支持直接传递未加引号的字符变量。推荐采用先声明空哈希对象,再用load方法加载数据集的方式,代码如下:

function somefunction(dsn $, k1 $, k2 $, k3 $, k4 $);
  declare hash h(); /* 声明空哈希对象 */
  rc = h.defineKey('k1', 'k2', 'k3', 'k4');
  rc = h.defineData('d1', 'd2', 'd3', 'd4', 'd5', 'd6');
  rc = h.definedone();
  rc = h.load(dataset: dsn); /* 直接传入参数dsn加载数据集 */
  rc = h.find();
  /* 后续业务逻辑 */
return(rc); /* 根据需求返回对应值 */
endsub;

如果坚持要在declare语句中传入参数,可以通过字符串拼接生成带引号的数据集名称:

function somefunction(dsn $, k1 $, k2 $, k3 $, k4 $);
  declare hash h(dataset: cats("'", trim(dsn), "'")); /* 拼接单引号生成符合要求的字符串 */
  rc = h.defineKey('k1', 'k2', 'k3', 'k4');
  rc = h.defineData('d1', 'd2', 'd3', 'd4', 'd5', 'd6');
  rc = h.definedone();
  rc = h.find();
  /* 后续业务逻辑 */
return(rc);
endsub;

参数规则说明

  • declare语句的dataset参数:必须传入带引号的字符串(字面量、带引号的字符变量或包裹宏变量的双引号字符串)
  • load方法的dataset参数:可直接传入未加引号的字符变量

内容的提问来源于stack exchange,提问作者Manuel Rossetti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:27:32