Where子句中的SAS Proc SQL宏变量

Where子句中的SAS Proc SQL宏变量,sas,proc-sql,enterprise-guide,Sas,Proc Sql,Enterprise Guide,我试图在SAS中使用PROC SQL语句中的Prompt manager变量编写程序。它对我不起作用,一直说这个符号不被识别,将被忽略 这是我的代码示例 LIBNAME mylib ORACLE SCHEMA = 'myschema' PATH = prd USER = 'admin' PASSWORD = 'admin12'; PROC SQL; SELECT DISTINCT TEST_ID, COUNT(*), TERM

我试图在SAS中使用
PROC SQL
语句中的Prompt manager变量编写程序。它对我不起作用,一直说这个符号不被识别,将被忽略

这是我的代码示例

LIBNAME mylib ORACLE  SCHEMA = 'myschema'  PATH = prd  USER = 'admin'    PASSWORD = 'admin12';

PROC SQL;
   SELECT DISTINCT TEST_ID, COUNT(*), TERM                       
   FROM mylib.testtable 
   WHERE RELEASE = 'PRETEST' 
     AND TEST_ID IN (&TEST) /* 'MATH', 'READING', 'SCIENCE' */
     AND TERM = 'SPRING'  
   GROUP BY TEST_ID, TERM 
   ORDER BY TEST_ID, TERM;
QUIT;
下面是日志中的问题:

40          WHERE RELEASE = 'PRETEST'
41              AND TEST_ID IN (&TEST) /* 'MATH', 'READING', 'SCIENCE' */
NOTE: Line generated by the macro variable "TEST".
41         'MATH', 'READING', 'SCIENCE'
       _
       22
        _
        200
ERROR 22-322: Syntax error, expecting one of the following: a quoted string, a numeric constant, a datetime constant, 
          a missing value, (, -, SELECT.  

ERROR 200-322: The symbol is not recognized and will be ignored.

我的prompt变量是
&TEST
,应该包含要进行的测试列表,但它确实存在。

这里的问题与宏引用有关。很明显,由于某种原因,令牌被括在宏引号中(基本上类似于
%nrstr
),这导致它的工作方式与普通的
%let
稍有不同<代码>%unquote修复它。我怀疑还有一种更好的方法来定义提示,以避免这种情况发生,但我不完全确定——可能是经验更丰富的示例之一 人们可以回答

(定义名为
type
的文本单值提示,并将其附加到包含以下内容的程序:)


好吧,我找到了解决我困境的办法。正如Joe所说,这是一个宏引用问题,但也是一个数组问题。这两个问题都是通过用双引号和一些基本的复制来解决的

长话短说,
SAS处理数组和多个值的方式导致第一个值只显示第一个值,因此我必须分配多个可为空的值

工作成果如下:

SELECT DISTINCT 
   TEST_ID, COUNT(*),  TERM
FROM mylib.&TABLE 

WHERE RELEASE IN ("&RELEASE", "&RELEASE1", "&RELEASE2", "&RELEASE3") 
  AND TEST_ID IN ("&TEST", "&TEST1", "&TEST2", "&TEST3", "&TEST4", "&TEST5") 
  AND TERM IN ("&TERM", "&TERM1", "&TERM2", "&TERM3", "&TERM4") 

GROUP BY TEST_ID, TERM
ORDER BY TEST_ID, TERM;  
添加&Release、&Release1等。如果存在值数组,则允许捕获多个值,否则它将接受默认值中的第一个值 将其他值设置为null并引发警告


这足以向用户提供选项列表,并允许用户在每个字段中使用一个或多个参数运行这些选项

您可以再次检查您的列是否为字符列吗?@RobertPenridge这将是另一个错误,我想。您定义了什么样的提示?您能否准确地解释一下定义提示的步骤?如果是,请在(“&TEST”)中测试\u ID如果:您传递了一个参数,或者您想要传递的数组中的第一个值
SELECT DISTINCT 
   TEST_ID, COUNT(*),  TERM
FROM mylib.&TABLE 

WHERE RELEASE IN ("&RELEASE", "&RELEASE1", "&RELEASE2", "&RELEASE3") 
  AND TEST_ID IN ("&TEST", "&TEST1", "&TEST2", "&TEST3", "&TEST4", "&TEST5") 
  AND TERM IN ("&TERM", "&TERM1", "&TERM2", "&TERM3", "&TERM4") 

GROUP BY TEST_ID, TERM
ORDER BY TEST_ID, TERM;