在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
相关产品推荐
相关产品推荐

