Where子句中的SAS Proc SQL宏变量
我试图在SAS中使用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
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;