删除指定逻辑库中的空表,可以使用SQL形式的通配符,即_和%
- %macro DropEmptyTables(LibName,Filter);
- /**********************************************************************/
- /* 此宏用于删除指定逻辑库中的空表,也即观测值为零的表格。其中LibName */
- /* 是指定逻辑库名称;Filter是文件过滤设置,=Null时删除全部空表,包含 */
- /* _和%等SQL中like子句的通配符时删除指定前后缀的空表,不包含任何通配 */
- /* 符时删除指定空表,若指定表不为空则不删除。 */
- /* */
- /* 最终指定逻辑库下所有符合条件的空表全部被删除。 */
- /* */
- /* Created on 2011.11.14 */
- /* Modified on 2012.4.25 */
- /**********************************************************************/
- %if &LibName EQ %STR() %then %let LibName=Work;
- %if &Filter EQ %STR() %then %let Filter=Null;
- %if %UPCASE(&Filter) EQ NULL %then %do;
- proc sql noprint;
- select count(memname) into :DET_EmptyTableNum
- from SASHELP.Vtable
- where UPCASE(libname) EQ UPCASE("&LibName") AND nobs EQ 0;
- quit;
- %if &DET_EmptyTableNum EQ 0 %then %do;
- %put NOTE: There is no empty table or dataset in the specified library, therefore none of table is dropped.;
- %goto exit;
- %end;
- %else %do;
- proc sql noprint;
- select memname into :DET_EmptyTableList separated by ' '
- from SASHELP.Vtable
- where UPCASE(libname) EQ UPCASE("&LibName") AND nobs EQ 0;
- quit;
- %end;
- %end;
- %else %if (%SYSFUNC(FIND(&Filter,_)) NE 0) OR (%SYSFUNC(FIND(&Filter,%)) NE 0) %then %do;
- proc sql noprint;
- select count(memname) into :DET_EmptyTableNum
- from SASHELP.Vtable
- where UPCASE(libname) EQ UPCASE("&LibName") AND
- UPCASE(memname) like UPCASE("&Filter") AND nobs EQ 0;
- quit;
- %if &DET_EmptyTableNum EQ 0 %then %do;
- %put NOTE: There is no empty table or dataset in the specified library, therefore none of table is dropped.;
- %goto exit;
- %end;
- %else %do;
- proc sql noprint;
- select memname into :DET_EmptyTableList separated by ' '
- from SASHELP.Vtable
- where UPCASE(libname) EQ UPCASE("&LibName") AND
- UPCASE(memname) like UPCASE("&Filter") AND nobs EQ 0;
- quit;
- %end;
- %end;
- %else %do;
- proc sql noprint;
- select count(memname) into :DET_EmptyTableNum
- from SASHELP.Vtable
- where UPCASE(libname) EQ UPCASE("&LibName") AND
- UPCASE(memname) EQ UPCASE("&Filter") AND nobs EQ 0;
- quit;
- %if &DET_EmptyTableNum EQ 0 %then %do;
- %put NOTE: There is no empty table or dataset in the specified library, therefore none of table is dropped.;
- %goto exit;
- %end;
- %else %do;
- proc sql noprint;
- select memname into :DET_EmptyTableList separated by ' '
- from SASHELP.Vtable
- where UPCASE(libname) EQ UPCASE("&LibName") AND
- UPCASE(memname) EQ UPCASE("&Filter") AND nobs EQ 0;
- quit;
- %end;
- %end;
- proc sql noprint;
- %do DET_i=1 %to &DET_EmptyTableNum;
- %let DET_Dataset=%SCAN(&DET_EmptyTableList,&DET_i);
- drop table &LibName..&DET_Dataset;
- %end;
- quit;
- %exit:
- %mend;
- %macro Demo();
- %let LibName=Work;
- %let Filter="a%"; /* =Null时删除全部空表;包含_和%等SQL中like子句的通配符时删除指定前后缀的空表,注意此时要加双引号;不包含任何通配符时删除指定空表 */
- %DropEmptyTables(&LibName,&Filter);
- %mend;


雷达卡



京公网安备 11010802022788号







