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

SAS代码在交互和批处理模式下的行为不同,sas,sas-macro,Sas,Sas Macro,我有以下在宏中运行的代码。当它在交互模式下运行时,它运行完全正常,没有错误或警告。这是过去两年的情况 同一代码现在已在批处理模式下部署,并生成警告警告:未解析明显符号引用FIRSTRECCOUNT。且未为宏变量指定值 我的问题是,有人知道为什么批处理模式和交互模式会有不同的表现吗 以下是更多信息: 正在创建数据集,该数据集位于工作库中 数据集确实是按数据步骤打开的 `“firstreccount”不会在程序中的任何其他位置进行初始化 我有一个搜索sas社区。有一个主题,但我在批初始化中没有答案中

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

同一代码现在已在批处理模式下部署,并生成警告
警告:未解析明显符号引用FIRSTRECCOUNT。
且未为宏变量指定值

我的问题是,有人知道为什么批处理模式和交互模式会有不同的表现吗

以下是更多信息:

  • 正在创建数据集,该数据集位于工作库中

  • 数据集确实是按数据步骤打开的

  • `“firstreccount”不会在程序中的任何其他位置进行初始化
  • 我有一个搜索sas社区。有一个主题,但我在批初始化中没有答案中描述的错误
  • 有关的详细信息(但未解释)将在交互模式下工作,但不会在批处理模式下工作

    更新:

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

    顺便说一下,原始作业是从sasdi工作室部署的。我已经检查了用户编写的代码节点中的所有行,并确保长度在@RawFocus、@RobertPentridge建议的80个字符以内,但这并没有解决问题。 正如@data_null_u建议的那样,我已经检查了VALIDVARNAME,它在交互模式(值为“any”)和批处理模式(值为“V7”)之间是不同的,但更改它们并没有带来任何区别

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

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


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

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

    问题可能发生在您粘贴的代码段上方。解析器在早些时候陷入了恐慌,最后发出了关于代码的警告,这是完全正确的


    检查以确保宏中的代码在一行中长度不超过160个字符。我尽量将代码保持在这一水平以下,但长代码行可以以交互方式正常运行,并在批处理中失败—特别是在宏内部时。

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

    见:


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

    对我来说没有意义。我会加上“这行跑”;在STOP语句之前,确保执行调用symput。并添加%put>&firstreccountAdd symbolgen和mprint并发布日志。典型的错误是行长度太长,但代码中没有任何内容太长,限制为256。您是如何执行批处理的?与interactive相同的用户Id?SECONDSET的值是多少?SASLOG 1750-1754线路上有什么?显示更多日志,不要编辑它。您是否尝试过调用symputx('FIRSTRECCOUNT',X',G')?可能出于某种原因,它将宏存储在本地符号表中。“这至少可以排除这个问题。”昆汀我花了一些时间,但我已经用我的发现更新了我的问题。这一切都与SAS DI studio在部署时如何更改代码有关。如果发生这种情况,您至少会在日志中看到一条关于“SAS set obs=0并将继续”的注释。你有一个好的日志扫描程序来查找任何早期的错误/警告/错误注释吗?我已经记住了你程序中的错误。你必须找到它。例如,在我的网站上,EG使用validvarname=ANY,而批处理使用validvarname=V7,这可能会导致在EG中开发的程序出错,但随后会在批处理中运行。这一点很好。截断的行在日志中至少抛出一个注释,甚至可能是一个警告。所以一个好的日志扫描器应该能捕捉到它。啊,是的,你已经涵盖了我的观点。就我个人而言,我将所有的.sas文件保留为80个字符或更少,这使得它们在扩散时更容易在单个屏幕上看到..嘿@RawFocus,它是9.3,你可能有道理。我会在我的问题中留下我的结果,以解决每个人的观点,并分享我的发现。
    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.