【问题标题】:SAS code behaves differently in interactive and batch modesSAS 代码在交互模式和批处理模式下的行为不同
【发布时间】:2016-01-29 09:39:38
【问题描述】:

我有以下在宏内运行的代码。当它以交互模式运行时,它运行得非常好,没有错误或警告。过去两年就是这样。

相同的代码现在已以批处理模式部署,它会生成警告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 工作室部署的。我检查了用户编写的代码节点中的所有行,并确保长度在@RawFocus、@RobertPentridge 推荐的 80 个字符以内,但它没有解决问题。 正如@data_null_ 推荐的那样,我已经检查了 VALIDVARNAME,它在交互模式(“any”的值)和批处理模式(“V7”的值)之间是不同的,但改变这些并没有任何区别。

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

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

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

【问题讨论】:

  • 对我来说没有意义。我会加上“这条线跑了”;紧接在 STOP 语句之前,以确保执行调用符号。并添加 %put >>&firstreccount
  • 添加 symbolgen 和 mprint 并发布日志。典型的错误是行长度太长,但您的代码中没有任何内容显得太长,256 是限制。你是如何批量执行的?与交互式用户 ID 相同?
  • &SECONDSET 的值是多少? SASLOG 第 1750-1754 行是什么?显示更多 LOG,不要编辑它。
  • 你试过call symputx('FIRSTRECCOUNT', X, 'G')吗?也许它出于某种原因将宏存储在本地符号表中。这至少可以排除这个问题。
  • @Quentin 我花了一段时间,但我已经用我的发现更新了我的问题。这与 SAS DI studio 在部署时如何更改代码有关。

标签: sas sas-macro


【解决方案1】:

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

检查以确保宏中的代码没有超过单行约 160 个字符。我尽量让我的代码远低于这个值,但长代码行可以交互地运行并且批量失败 - 特别是在宏内部时。

【讨论】:

  • 好点。截断的行至少会在日志中抛出一个注释,甚至可能是一个警告。所以一个好的日志扫描器应该能捕捉到它。
  • 啊是的 - 你已经涵盖了我的观点。就我个人而言,我将所有 .sas 文件保持在 80 个字符以内,这使得它们在比较时更容易在单个屏幕上查看..
【解决方案2】:

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

【讨论】:

  • 如果发生这种情况,您至少会在日志中看到一条关于“SAS set obs=0 and will continue”等等的注释。您是否有一个好的日志扫描器来查找任何早期的错误/警告/不良记录?
  • 我想到了您程序中的错误。你必须找到它。例如,在我的站点 EG 有 validvarname=ANY 而批处理使用 VALIDVARNAME=V7 这可能会导致在 EG 中开发但后来在 BATCH 中运行的程序出错。
【解决方案3】:

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

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

您运行的是哪个版本的 SAS?

【讨论】:

  • 嘿@RawFocus,现在是 9.3,你可能有道理。我将在我的问题中留下我的结果,以解决每个人的观点并分享我的发现。
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 2020-02-23
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多