在SAS子句

时间:2015-06-09 13:02:03

标签: sas proc-sql enterprise-guide

我正在尝试使用PROC SQL语句中的提示管理器变量在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,并且应该保留要进行的测试列表,但它很有用。

2 个答案:

答案 0 :(得分:1)

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

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

proc sql;
  select name, age
    from sashelp.class;
    where name in (%unquote(&type.))
  ;
quit;

答案 1 :(得分:0)

好的,我找到了解决我的困境的办法。正如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并发出警告。

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