使用LIKE';%字符串%';在SAS SQL中搜索并获取错误

使用LIKE';%字符串%';在SAS SQL中搜索并获取错误,sql,sas,Sql,Sas,有一个非常不寻常的问题。我有一个SAS程序,运行一些SQL代码 这是代码的一部分: NOT LIKE '%CLOSE%' 当我从SAS Enterprise Guide运行我的程序时,它可以工作,但当我在linux中运行我的程序SAS/path/program.SAS时,我遇到以下错误: 错误:宏关键字关闭尚未实现。 SQL代码的另一个错误: NOT LIKE ('%return%') 获取:错误:%RETURN语句在开放代码中无效。 我想知道是否有解决办法?我的建议是:看看是否有截断的行,

有一个非常不寻常的问题。我有一个SAS程序,运行一些SQL代码

这是代码的一部分:

NOT LIKE '%CLOSE%'
当我从SAS Enterprise Guide运行我的程序时,它可以工作,但当我在linux中运行我的程序
SAS/path/program.SAS
时,我遇到以下错误:

错误:宏关键字关闭尚未实现。

SQL代码的另一个错误:

NOT LIKE ('%return%')
获取:
错误:%RETURN语句在开放代码中无效。


我想知道是否有解决办法?

我的建议是:看看是否有截断的行,或者是否有不平衡的引用。如果
LRECL
系统选项不够长,可能会发生截断。你应该得到一个警告,但也许你没有注意到

这可能会导致您的报价不平衡,这意味着您(先前)

成为

'LONG STRING THAT IS BEING TRUNC
... more code ...
like '%return%';
这意味着第三行的第一个
将成为上述字符串的结束引号,然后
%return
将处于打开代码中

您可能会收到一条关于截断的警告,或者是
QUOTELENMAX
警告(“警告:字符串超过255个字符”或类似的内容)

您还应该检查是否有任何注释(可能是您通常不会在执行中包含的注释)带有单引号。例如:

*don't do this;
如果是在宏中,SAS宏解析器(例如,DM或batch)会将其作为引号进行解析,并在引用之后导致失败。(感谢@Robert Pendridge提醒我这一点。)


你应该做的另一件事是测试一个简单的测试用例——看看这是否发生在简单的用例中,如果没有,那么简化你的真实用例,直到它与测试用例相似

一个好的测试用例:

%macro test;
proc sql;
  select * from sashelp.class
  where name like '%return%';
quit;
%mend test;
%test;

当然,不应选择任何行,但不应发生错误。然后尽可能少地改变这个,一次一点,直到你得到你的错误;然后你就可以看到问题了。

好的,为了让它起作用,我做了这种类型的“变通”:

/* NOT LIKE '%CLOSE%' */
NOT LIKE '%'||'CLOSE'||'%'

/* NOT LIKE ('%return%') */
NOT LIKE ('%'||'return'||'%')

奇怪,我怀疑这是个问题,但是你试过用双引号而不是单引号吗
vs
?或者可能需要转义%s?可能是因为这些是
保留的
关键字。这可能是代码中出现问题的迹象(作为我的答案),也可能是SAS宏解析器有问题。
是正确的(而不是
),并且它们在该上下文中应该是合法的(即使是保留字)。您可以创建一个虚拟数据集来测试该语句。然后试着在提交程序时只带上那句话?另外,你是如何将你的代码从EG下载到Linux的?还有一些检查。。。。如果以批处理模式提交(至少在Windows中),则%宏定义中有任何一行长度超过?150ish?字符可能被截断并导致问题(即使没有引号)。最好是保持它们很短。最后,作为一种极端检查,尝试删除注释。我遇到过非常罕见的问题,标题注释会使解析器出错。当您有一条注释中只有一个引号时,SAS宏解析器绝对会出错-例如
*不要这样做-但它在EG中也应该这样做,当然。是的。这是十多年前我第一次遇到它,但我认为它来自于
/***/
风格的评论,因为我花了一整天的时间才弄明白,我确实记得当我发现它时,我很怀疑。但不能百分之百肯定。在最好的情况下,我的记忆相当糟糕……在
/**/
风格的注释中,它不会被解析,幸运的是,尽管这可能是一个更新的东西。(至少在9.3中不会)仍然无法理解。。。“最糟糕的部分”是它按照SAS Enterprise Guide的预期工作!
/* NOT LIKE '%CLOSE%' */
NOT LIKE '%'||'CLOSE'||'%'

/* NOT LIKE ('%return%') */
NOT LIKE ('%'||'return'||'%')