mirror of
https://github.com/sasjs/core.git
synced 2026-01-16 13:00:05 +00:00
feat: adding ignore_cols (and mdebug) parameters to mp_guesspk.sas, as well as a code tidy up
This commit is contained in:
@@ -17,16 +17,21 @@
|
|||||||
%inc mc;
|
%inc mc;
|
||||||
%mp_guesspk(sashelp.class,outds=classpks)
|
%mp_guesspk(sashelp.class,outds=classpks)
|
||||||
|
|
||||||
@param baseds The dataset to analyse
|
@param [in] baseds The dataset to analyse
|
||||||
@param outds= The output dataset to contain the possible PKs
|
@param [out] outds= The output dataset to contain the possible PKs
|
||||||
@param max_guesses= (3) The total number of possible primary keys to generate.
|
@param [in] max_guesses= (3) The total number of possible primary keys to
|
||||||
A table may have multiple unlikely PKs, so no need to list them all.
|
generate. A table may have multiple (unlikely) PKs, so no need to list them
|
||||||
@param min_rows= (5) The minimum number of rows a table should have in order
|
all.
|
||||||
to try and guess the PK.
|
@param [in] min_rows= (5) The minimum number of rows a table should have in
|
||||||
|
order to try and guess the PK.
|
||||||
|
@param [in] ignore_cols (0) Space seperated list of columns which you are
|
||||||
|
sure are not part of the primary key (helps to avoid false positives)
|
||||||
|
@param [in] mdebug= Set to 1 to enable DEBUG messages and preserve outputs
|
||||||
|
|
||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getvarlist.sas
|
@li mf_getvarlist.sas
|
||||||
@li mf_getuniquename.sas
|
@li mf_getuniquename.sas
|
||||||
|
@li mf_wordsInstr1butnotstr2.sas
|
||||||
@li mf_nobs.sas
|
@li mf_nobs.sas
|
||||||
|
|
||||||
<h4> Related Macros </h4>
|
<h4> Related Macros </h4>
|
||||||
@@ -41,11 +46,22 @@
|
|||||||
,outds=mp_guesspk
|
,outds=mp_guesspk
|
||||||
,max_guesses=3
|
,max_guesses=3
|
||||||
,min_rows=5
|
,min_rows=5
|
||||||
|
,ignore_cols=0
|
||||||
|
,mdebug=0
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
/* declare local vars */
|
/* declare local vars */
|
||||||
%local var vars vcnt i j k l tmpvar tmpds rows posspks ppkcnt;
|
%local var vars vcnt i j k l tmpvar tmpds rows posspks ppkcnt;
|
||||||
%let vars=%mf_getvarlist(&baseds);
|
%let vars=%upcase(%mf_getvarlist(&baseds));
|
||||||
|
%put &=vars;
|
||||||
|
%let vars=%mf_wordsInStr1ButNotStr2(str1=&vars,str2=%upcase(&ignore_cols));
|
||||||
|
%put &=vars;
|
||||||
%let vcnt=%sysfunc(countw(&vars));
|
%let vcnt=%sysfunc(countw(&vars));
|
||||||
|
|
||||||
%if &vcnt=0 %then %do;
|
%if &vcnt=0 %then %do;
|
||||||
@@ -146,7 +162,7 @@
|
|||||||
insert into &outds values("&lev1 &lev2");
|
insert into &outds values("&lev1 &lev2");
|
||||||
%if %mf_nobs(&outds) ge &max_guesses %then %do;
|
%if %mf_nobs(&outds) ge &max_guesses %then %do;
|
||||||
%put &sysmacroname: Max PKs reached at Level 2 for &baseds;
|
%put &sysmacroname: Max PKs reached at Level 2 for &baseds;
|
||||||
%return;
|
%goto exit;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
@@ -155,7 +171,7 @@
|
|||||||
|
|
||||||
%if &ppkcnt=2 %then %do;
|
%if &ppkcnt=2 %then %do;
|
||||||
%put &sysmacroname: No more PK guess possible;
|
%put &sysmacroname: No more PK guess possible;
|
||||||
%return;
|
%goto exit;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
/* begin scanning for uniques on PK triplets */
|
/* begin scanning for uniques on PK triplets */
|
||||||
@@ -176,7 +192,7 @@
|
|||||||
insert into &outds values("&lev1 &lev2 &lev3");
|
insert into &outds values("&lev1 &lev2 &lev3");
|
||||||
%if %mf_nobs(&outds) ge &max_guesses %then %do;
|
%if %mf_nobs(&outds) ge &max_guesses %then %do;
|
||||||
%put &sysmacroname: Max PKs reached at Level 3 for &baseds;
|
%put &sysmacroname: Max PKs reached at Level 3 for &baseds;
|
||||||
%return;
|
%goto exit;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
@@ -186,7 +202,7 @@
|
|||||||
|
|
||||||
%if &ppkcnt=3 %then %do;
|
%if &ppkcnt=3 %then %do;
|
||||||
%put &sysmacroname: No more PK guess possible;
|
%put &sysmacroname: No more PK guess possible;
|
||||||
%return;
|
%goto exit;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
/* scan for uniques on up to 4 PK fields */
|
/* scan for uniques on up to 4 PK fields */
|
||||||
@@ -210,7 +226,7 @@
|
|||||||
insert into &outds values("&lev1 &lev2 &lev3 &lev4");
|
insert into &outds values("&lev1 &lev2 &lev3 &lev4");
|
||||||
%if %mf_nobs(&outds) ge &max_guesses %then %do;
|
%if %mf_nobs(&outds) ge &max_guesses %then %do;
|
||||||
%put &sysmacroname: Max PKs reached at Level 4 for &baseds;
|
%put &sysmacroname: Max PKs reached at Level 4 for &baseds;
|
||||||
%return;
|
%goto exit;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
@@ -221,7 +237,7 @@
|
|||||||
|
|
||||||
%if &ppkcnt=4 %then %do;
|
%if &ppkcnt=4 %then %do;
|
||||||
%put &sysmacroname: No more PK guess possible;
|
%put &sysmacroname: No more PK guess possible;
|
||||||
%return;
|
%goto exit;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
/* scan for uniques on up to 4 PK fields */
|
/* scan for uniques on up to 4 PK fields */
|
||||||
@@ -248,7 +264,7 @@
|
|||||||
insert into &outds values("&lev1 &lev2 &lev3 &lev4 &lev5");
|
insert into &outds values("&lev1 &lev2 &lev3 &lev4 &lev5");
|
||||||
%if %mf_nobs(&outds) ge &max_guesses %then %do;
|
%if %mf_nobs(&outds) ge &max_guesses %then %do;
|
||||||
%put &sysmacroname: Max PKs reached at Level 5 for &baseds;
|
%put &sysmacroname: Max PKs reached at Level 5 for &baseds;
|
||||||
%return;
|
%goto exit;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
@@ -260,7 +276,7 @@
|
|||||||
|
|
||||||
%if &ppkcnt=5 %then %do;
|
%if &ppkcnt=5 %then %do;
|
||||||
%put &sysmacroname: No more PK guess possible;
|
%put &sysmacroname: No more PK guess possible;
|
||||||
%return;
|
%goto exit;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
/* scan for uniques on up to 4 PK fields */
|
/* scan for uniques on up to 4 PK fields */
|
||||||
@@ -276,8 +292,8 @@
|
|||||||
%if &lev1 ne &lev4 and &lev2 ne &lev4 and &lev3 ne &lev4 %then
|
%if &lev1 ne &lev4 and &lev2 ne &lev4 and &lev3 ne &lev4 %then
|
||||||
%do m=5 %to &ppkcnt;
|
%do m=5 %to &ppkcnt;
|
||||||
%let lev5=%scan(&posspks,&m);
|
%let lev5=%scan(&posspks,&m);
|
||||||
%if &lev1 ne &lev5 & &lev2 ne &lev5 & &lev3 ne &lev5 & &lev4 ne &lev5 %then
|
%if &lev1 ne &lev5 & &lev2 ne &lev5 & &lev3 ne &lev5 & &lev4 ne &lev5
|
||||||
%do n=6 %to &ppkcnt;
|
%then %do n=6 %to &ppkcnt;
|
||||||
%let lev6=%scan(&posspks,&n);
|
%let lev6=%scan(&posspks,&n);
|
||||||
%if &lev1 ne &lev6 & &lev2 ne &lev6 & &lev3 ne &lev6
|
%if &lev1 ne &lev6 & &lev2 ne &lev6 & &lev3 ne &lev6
|
||||||
& &lev4 ne &lev6 & &lev5 ne &lev6 %then
|
& &lev4 ne &lev6 & &lev5 ne &lev6 %then
|
||||||
@@ -293,7 +309,7 @@
|
|||||||
values("&lev1 &lev2 &lev3 &lev4 &lev5 &lev6");
|
values("&lev1 &lev2 &lev3 &lev4 &lev5 &lev6");
|
||||||
%if %mf_nobs(&outds) ge &max_guesses %then %do;
|
%if %mf_nobs(&outds) ge &max_guesses %then %do;
|
||||||
%put &sysmacroname: Max PKs reached at Level 6 for &baseds;
|
%put &sysmacroname: Max PKs reached at Level 6 for &baseds;
|
||||||
%return;
|
%goto exit;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
@@ -306,7 +322,13 @@
|
|||||||
|
|
||||||
%if &ppkcnt=6 %then %do;
|
%if &ppkcnt=6 %then %do;
|
||||||
%put &sysmacroname: No more PK guess possible;
|
%put &sysmacroname: No more PK guess possible;
|
||||||
%return;
|
%goto exit;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%exit:
|
||||||
|
%if &mdebug=0 %then %do;
|
||||||
|
proc sql;
|
||||||
|
drop table &tmpds;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
%mend mp_guesspk;
|
%mend mp_guesspk;
|
||||||
Reference in New Issue
Block a user