如何在SAS中复制库数据集并自动跳过已复制的数据集
自动跳过已存在数据集的SAS备份方案
方法1:利用字典表自动生成排除列表
直接通过SAS系统元数据表动态获取目标库已有的数据集,自动生成排除项,无需手动维护列表。修改你的备份宏如下:
%macro BACKUP; %do year=1983 %to 2000; options compress=yes; /* 查询目标库已存在的数据集,存入宏变量 */ proc sql noprint; select memname into :exclude_list separated by ' ' from dictionary.tables where libname = upcase("backup&year.") and memtype = 'DATA'; quit; proc copy in=jobs&year. out=backup&year. memtype=data; /* 仅当目标库有数据集时执行排除 */ %if &sqlobs. > 0 %then %do; exclude &exclude_list.; %end; run; %end; %mend; %BACKUP;
方法2:精准选择待复制数据集
反过来筛选源库有但目标库没有的数据集,用select语句明确指定要复制的对象,逻辑更直观:
%macro BACKUP; %do year=1983 %to 2000; options compress=yes; /* 比对源库和目标库,生成待复制数据集列表 */ proc sql noprint; select a.memname into :select_list separated by ' ' from dictionary.tables a left join dictionary.tables b on a.memname = b.memname and b.libname = upcase("backup&year.") where a.libname = upcase("jobs&year.") and a.memtype = 'DATA' and b.memname is missing; quit; /* 仅当有待复制数据集时执行备份 */ %if &sqlobs. > 0 %then %do; proc copy in=jobs&year. out=backup&year. memtype=data; select &select_list.; run; %end; %else %do; %put NOTE: 库backup&year.已包含jobs&year.的所有数据集,无需执行复制; %end; %end; %mend; %BACKUP;
关键细节说明
dictionary.tables是SAS内置的元数据表,实时存储所有库、数据集的元信息,用它做比对最准确upcase()函数用于统一库名大小写,避免SAS字典表中库名大写存储导致的查询遗漏&sqlobs.是PROC SQL自动生成的宏变量,记录查询返回的行数,用来判断是否需要执行备份操作
内容的提问来源于stack exchange,提问作者LuizZ
相关产品推荐
相关产品推荐

