【问题标题】:Resolving macro variable inside PROC SQL在 PROC SQL 中解析宏变量
【发布时间】:2017-06-05 15:18:43
【问题描述】:

我有一个宏变量需要在 PROC SQL 中使用。它解析的方式似乎具有完美的语法,但我遇到语法错误,我不确定为什么;

%let test = mytext;
PROC SQL;
CREATE TABLE myTalbe&test AS
SELECT DISTINCT
    a.column
FROM
    tablename a
WHERE
    a.column = %bquote('&test')
;QUIT;

我得到的错误在解析的文本下抛出一条红线,'mytext',并说

ERROR 22-322:语法错误,需要以下之一:名称,a 带引号的字符串、数字常量、日期时间常量、 缺失值,(, *, +, -, ALL, ANY, BTRIM, CALCULATED, CASE, INPUT, PUT, SELECT, SOME, SUBSTRING, TRANSLATE, 用户。

我觉得这个错误在这里不适用。如果我在 'mytext' 中硬编码,它工作正常。我在我的鼻子底下错过了什么吗?谁能帮帮我?

谢谢!!!

【问题讨论】:

  • 我们不鼓励使用 enterprise-guide 标签,除非您询问 EG 功能(相对于 SAS 语言功能)。

标签: sas


【解决方案1】:

宏引用使 SAS 解析器感到困惑。对于这个程序,我将删除 %bquote() 的使用,而只使用双引号而不是单引号,以便解析宏变量引用。

WHERE a.column = "&test"

如果您实际上是通过 SQL 生成传递到需要对字符串文字使用单引号的系统,那么您将需要使用 %unquote() 来删除宏引用。

... from connection to ... ( ...
WHERE a.column = %unquote(%bquote('&test'))
... ) ...

【讨论】:

  • 当我有传递时,我总是使用 %bquote。在发布此问题之前,我会发誓我先尝试了双引号并且遇到了问题。不过我得把它给艾伦,因为他先回答了!谢谢,汤姆!
【解决方案2】:

BQUOTE 函数尝试在执行时立即解析该值。尝试删除它并改用双引号:

%let test = mytext;
PROC SQL;
CREATE TABLE myTalbe&test AS
SELECT DISTINCT
    a.column
FROM
    tablename a
WHERE
    a.column = "&test"
;QUIT;

【讨论】:

  • 这会产生同样的错误,这次用双引号显示我想要的输出
  • 注意:由宏函数“BQUOTE”生成的行。 77 "mytext" 这个出现在错误之前
  • 抱歉,是的 - bquote 很有趣!答案已更新
  • 我会发誓我已经这样做了,但它没有用。这种只使用双引号似乎给了我想要的输出。谢谢,艾伦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
相关资源
最近更新 更多