我正在尝试使用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
,并且应该保留要进行的测试列表,但它很有用。
答案 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)
长话短说,
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并发出警告。
这足以为用户提供选项列表,并允许他们在每个字段中使用一个或多个参数运行