我有一个要验证的控件。我想编写一个包含SQL proc的宏变量,以防条件被验证。范例:
%Macro Control1(List) / minoperator mindelimiter=' ';
%IF &Control1 in &List. %Then %do;
proc sql;
create table work.&Control1 as
Select id, count(id) as number
From data.&Produit.
group by id
having calculated number > 1
;
quit;
%end;
%mend;
%let list = &control1. &control2 &Control4 ;
%Control1(&List);
如果我们对control3执行相同的过程,则proc sql不会运行,因为control3不属于该列表。
我可能在语法上有一些错误?
您的主要问题是,您需要让SAS知道要在宏逻辑中使用in
作为运算符。
要使用宏语言将IN
用作运算符,则需要设置MINOPERATOR
选项。为了确保它始终对您的宏有效,而与系统选项的设置方式无关,请将其添加到%macro
语句中。
%macro Control1(List) / minoperator mindelimiter=' ';
但是您还有其他一些问题。
在为宏定义参数时,您只想输入要参数化的名称。您的示例在名称前有一个&
,该名称将是无效的语法,并且用于引用宏变量的值,并且您不能使用该值对宏变量进行命名。因此,在定义宏时,只需列出名称
%macro control1(list) .....
注意,当您将参数值传递给宏时,如您在示例调用中所做的那样,请注意,当调用CALL宏可以引用宏变量时。
%if
语句有多个问题。第一个似乎只是一个错字,在e
宏变量名称的末尾添加了一个额外的list
。第二个是逻辑错误。宏变量CONTROL1
的值永远不会与其周围带有双引号字符的值相同。此外,不需要()
运算符的值列表周围的in
,但它们不会引起任何实际问题。
%if &control1 in &list %then %do;
您的SELECT语句缺少您选择的两个变量之间的逗号。
select id,count(id) as number
您的HAVING子句中的条件是无效的语法。您是否要测试计数是否大于1?另外,如果要引用已计算的变量,则需要使用CALCULATED关键字。
having calculated number > 1
最后,在您的宏中引用两个宏变量CONTROL1和PROUDUIT可能会造成混淆,这两个宏变量不是由代码定义的(甚至没有在注释中记录)。它们不是输入参数。您尚未将它们声明为局部宏变量。或做任何事情以确保它们将存在。