先將兩個SAS DATA的屬性output到sit_var與uat_var,把欄位屬性變成觀測值。
如下:
data DB1_DS1;
length y $ 13.;
input x y z;
format x ddmmyy.;
datalines;
1 1 1
;
run;
data DB2_DS1;
length y $ 26.;
input x y z;
format x date9.;
datalines;
1 1 1
;
run;
ods trace on / listing;
proc contents data=DB1_DS1;
ods output Variables= sit_var;
run;
ods trace off;
ods trace on / listing;
proc contents data=DB2_DS1;
ods output Variables= uat_var;
run;
ods trace off;
在執行 %CK_VALUE 或 proc compare
%CK_VALUE(DB1_DATA=work.sit_var,
DB2_DATA=work.uat_var,
BY=Variable,
ALL_VAR=Type | Len| Format,
VAR_NUM=3)
結果:
如下:
data DB1_DS1;
length y $ 13.;
input x y z;
format x ddmmyy.;
datalines;
1 1 1
;
run;
data DB2_DS1;
length y $ 26.;
input x y z;
format x date9.;
datalines;
1 1 1
;
run;
ods trace on / listing;
proc contents data=DB1_DS1;
ods output Variables= sit_var;
run;
ods trace off;
ods trace on / listing;
proc contents data=DB2_DS1;
ods output Variables= uat_var;
run;
ods trace off;
在執行 %CK_VALUE 或 proc compare
/*====================================================
DATA1 DB_A 資料集1 work.也要輸入
DATA2 DB_B 資料集2
BY KEY
ALL_VAR 全部變數名稱 | 分隔
VAR_NUM 幾個變數
JIMMY CHEN
======================================================*/
%macro CK_VALUE(DB1_DATA=,
DB2_DATA=,
BY =,
ALL_VAR = ,
VAR_NUM=);
%let DATA1 = %scan(&DB1_DATA., 2,%str(.));
%let DATA2 = %scan(&DB2_DATA., 2,%str(.));
proc sort data = &DB1_DATA. out = DB1_REN nodupkey; by &BY.;run;
proc sort data = &DB2_DATA. out = DB2_REN nodupkey; by &BY.;run;
%do d = 1 %to 2;
%do VAR_N = 1 %to &VAR_NUM.;
%let VAR&VAR_N. = %scan(&ALL_VAR., &VAR_N.,%str(|));
/* %put &&VAR&VAR_N.. ;*/
/* %put &&VAR&VAR_N.._&&DATA&D..;*/
data DB&d._REN;
length &&VAR&VAR_N.._ck $30.;
set DB&d._REN(rename =(&&VAR&VAR_N.. =&&VAR&VAR_N.._DB&d.));
run;
%end;
%end;
%do VAR_N = 1 %to &VAR_NUM.;
%let VAR&VAR_N. = %scan(&ALL_VAR., &VAR_N.,%str(|));
data CK_&&VAR&VAR_N.. (keep =&BY. &&VAR&VAR_N.._ck);
merge DB1_REN
DB2_REN;
by &BY.;
if &&VAR&VAR_N.._DB1 = &&VAR&VAR_N.._DB2 then &&VAR&VAR_N.._ck = "OK";
else &&VAR&VAR_N.._ck = "NG";
if missing(&&VAR&VAR_N.._DB1) then &&VAR&VAR_N.._ck = "NOT FOUND &DB1_DATA.";
if missing(&&VAR&VAR_N.._DB2) then &&VAR&VAR_N.._ck = "NOT FOUND &DB2_DATA.";
if missing(&&VAR&VAR_N.._DB1) and missing(&&VAR&VAR_N.._DB2) then &&VAR&VAR_N.._ck = "NOT FOUND";
run;
%end;
data CK_VALUE_ALL;
merge DB1_REN
DB2_REN;
by &BY.;
run;
%do VAR_N = 1 %to &VAR_NUM.;
%let VAR&VAR_N. = %scan(&ALL_VAR., &VAR_N.,%str(|));
data CK_VALUE_ALL;
merge CK_VALUE_ALL
CK_&&VAR&VAR_N..;
by &BY.;
run;
proc freq data = CK_VALUE_ALL;
title "檢核觀測值: &&VAR&VAR_N..";
table &&VAR&VAR_N.._ck;
run;title;
proc print data = Ck_value_all;
where &&VAR&VAR_N.._ck = "NG";
run;
%end;
%mend;
%CK_VALUE(DB1_DATA=work.sit_var,
DB2_DATA=work.uat_var,
BY=Variable,
ALL_VAR=Type | Len| Format,
VAR_NUM=3)
結果: