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

时间:2016-01-29 09:39:38

标签: sas sas-macro

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

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

我的问题是,有没有人有任何想法为什么批处理模式和交互模式会表现不同?

这里有更多信息:

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

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

  3. `firstreccount'没有在程序中的任何其他位置初始化
  4. 我有搜索sas社区。有一个主题here,但我在批处理初始化中没有与答案中描述的相同的错误。
  5. 有关warning的详细信息,但它没有解释,它可以在交互模式下工作,但不能在批处理模式下工作。
  6. 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,它在交互式(“任何”的值)和批处理模式(“V7”的值)之间有所不同,但改变这些并没有任何区别。

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

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

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

3 个答案:

答案 0 :(得分:2)

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

检查以确保宏中的代码不会超过单行上的〜160个字符。我尝试将代码保持在低于该值,但长行代码可以交互运行并且批量运行失败 - 特别是在宏内部时。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

您正在运行哪个版本的SAS?