2017-06-05 78 views
1

我有一个宏变量,我需要在PROC SQL中使用。它解决的方式似乎有完美的语法,但我得到一个语法错误,我不知道为什么;解决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:语法错误,需要下列之一:名称, 引用字符串,数字常量,日期时间常量, 缺少值,(*,+, - ,ALL,ANY,BTRIM,计算,CASE,输入,放置,选择,某些,底层,翻译, USER。

我不觉得这个错误在这里适用。如果我在'mytext'硬编码,它工作正常。我在我的鼻子下面错过了什么吗?任何人都可以借我一只手吗?

谢谢!

+0

除非您询问EG功能(与SAS语言功能相反),否则我们不鼓励使用[tag:enterprise-guide]标签。 – Joe

回答

1

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

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

这产生相同的错误,这次用双引号显示我想要的输出 –

+0

注意:由宏函数“BQUOTE”生成的行。 77“mytext” 这出现之前的错误 –

+0

道歉是 - 'bquote'是一个有趣的!回答更新 –

2

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

WHERE a.column = "&test" 

如果你实际上是产生直通SQL到需要使用单引号字符串常量,那么你将需要使用%unquote()删除宏报价系统。

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

当我有传递时,我总是使用%bquote。我会发誓我首先尝试双引号,并在发布此问题之前遇到了问题。我得把它交给艾伦,因为他先回答了!谢谢,汤姆! –