1

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

这是我的代码示例...

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.

我的提示变量是&TEST并且应该包含要进行的测试列表,但它不重要。

4

2 回答 2

1

这里的问题与宏引用有关。很明显,由于某种原因,令牌被包含在宏引号中(基本上类似于%nrstr),这导致它的工作方式与正常的%let. %unquote修复它。我怀疑还有一种更好的方法来定义提示以使这种情况不会发生,但我不完全确定 - 也许更有经验的 EG 人员之一可以回答。

(定义一个称为 TEXT - SINGLE VALUE 提示type并将其附加到包含此的程序:)

proc sql;
  select name, age
    from sashelp.class;
    where name in (%unquote(&type.))
  ;
quit;
于 2015-06-09T14:53:53.410 回答
0

好的,我找到了解决我困境的方法。正如乔所说,它是一个宏引用问题,但它也是一个数组问题。两者都可以通过将变量括在双引号和一些基本复制中来解决。

长话短说,
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 并引发警告。

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

于 2015-06-09T20:04:15.670 回答