使用LIKE';%字符串%';在SAS SQL中搜索并获取错误
有一个非常不寻常的问题。我有一个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语句在开放代码中无效。 我想知道是否有解决办法?我的建议是:看看是否有截断的行,
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'||'%')