SAS 代码在交互模式和批处理模式下的行为不同

SAS code behaves differently in interactive and batch modes

我有以下代码 运行ning 在宏中。当它在交互模式下是 运行 时,它 运行 绝对没问题,没有错误或警告。过去两年就是这种情况。

相同的代码现已以批处理模式部署,它会生成警告 WARNING: Apparent symbolic reference FIRSTRECCOUNT not resolved. 并且没有为宏变量赋值。

我的问题是,有没有人知道批处理模式和交互模式的行为为何不同?

这里有更多信息:

  1. 正在创建数据集,它在工作库中。

  2. 数据集确实被数据步骤打开了。

  3. `firstreccount' 没有在程序的其他任何地方初始化
  4. 我有搜索 sas 社区。有一个主题 here,但我在批处理初始化中没有出现与答案中描述的相同的错误。
  5. 关于warning的详细信息,但没有说明它可以在交互模式下工作,但不能在批处理模式下工作。

.

1735        %LET FIRSTSET = work.dataset1;

1744        DATA _NULL_;
1745            IF 0 THEN
1746                SET &FIRSTSET NOBS=X;
1747            CALL SYMPUT('FIRSTRECCOUNT' ,X);
1748            STOP;
1749        RUN;       

1755        DATA _NULL_;
1756            IF 0 THEN
1757                SET &SECONDSET NOBS=X;
1758            CALL SYMPUT('SECONDRECOUNT' ,X);
1759            STOP;
1760        RUN;
WARNING: Apparent symbolic reference FIRSTRECCOUNT not resolved.

更新:

所以我试图通过将带有警告的代码复制到单独的计划流程中来复制错误,但它根本没有导致任何错误。

顺便说一下,原来的作业是从SAS DI studio部署的。我已经检查了用户编写的代码节点中的所有行,并确保长度在@RawFocus、@RobertPentridge 推荐的 80 个字符以内,但这并没有解决问题。 正如@data_null_ 所推荐的,我已经检查了 VALIVARNAME,它在交互模式("any" 的值)和批处理模式("V7" 的值)之间是不同的,但是改变这些没有任何区别。

我已经重写了逻辑,通过调用 attr 来获取观察的数量,以获得一个开放的数据集。这消除了警告,但程序仍然会失败,警告会在不同的地方弹出。这让我觉得罗伯特·帕特里奇是正确的。同时,我得到一个宏没有被解析的错误。宏是由 DI studio 插入的,以收集性能 MI,即使这项工作并不意味着收集 MI。这让我觉得 SAS DI studio 在部署时没有正确生成代码,所以我手动编辑部署的代码以删除有问题的宏调用,我还发现有一行带有 MD5 函数的代码一行太长因为要传递给它一些参数,所以我插入了一些白色的space。问题终于解决了!!

我仍然需要对作业做一些事情,因为当它从 SAS DI 重新部署时,它会再次生成相同的错误。我现在没有时间进一步研究这个问题。

结论:您在 SAS DI 中编写的内容和部署的内容可能略有不同,这可能导致语法分析在随机位置抛出错误。所以我会将罗伯特的回答标记为正确的,因为它让我比其他任何答案更接近解决问题。

我希望你的程序在上面有一些小错误,不会导致 SAS 在 运行 交互时进入语法检查模式,但会导致 SAS 在 运行 时将 obs 设置为 0 并进入语法检查模式=]批量

问题可能出在您粘贴的代码段之上。解析器早些时候陷入困境,并最终发出关于代码完全正常的警告。

检查以确保宏中的代码在一行中的长度不超过 ~160 个字符。我尽量让我的代码远低于这个水平,但是长行代码可以 运行 交互地很好并且批量失败 - 特别是在宏内部时。

一种可能是您提交的 SAS 程序中一行的长度限制(在批处理模式下):

参见:http://support.sas.com/kb/15/883.html

你是哪个版本的 SAS 运行?