diff --git a/all.sas b/all.sas
index d1abba4..8a6a908 100644
--- a/all.sas
+++ b/all.sas
@@ -3444,6 +3444,10 @@ run;
located. If not provided, is ignored.
@param [out] outds= (0) The output table to load. If not provided, will
default to the table in the &ds parameter.
+ @param [in] flavour= (BASE) The SQL flavour to be applied to the output. Valid
+ options:
+ @li BASE (default) - suitable for regular proc sql
+ @li PGSQL - Used for Postgres databases
SAS Macros
@li mf_existfileref.sas
@@ -3455,18 +3459,29 @@ run;
@author Allan Bowe (credit mjsq)
**/
-%macro mp_ds2inserts(ds, outref=0,outlib=0,outds=0
+%macro mp_ds2inserts(ds, outref=0,outlib=0,outds=0,flavour=BASE
)/*/STORE SOURCE*/;
%if not %sysfunc(exist(&ds)) %then %do;
- %put %str(WARN)ING: &ds does not exist;
+ %put %str(WAR)NING: &ds does not exist;
+ %return;
+%end;
+
+%if not %sysfunc(exist(&ds)) %then %do;
+ %put %str(WAR)NING: &ds does not exist;
%return;
%end;
%if %index(&ds,.)=0 %then %let ds=WORK.&ds;
+%let flavour=%upcase(&flavour);
+%if &flavour ne BASE and &flavour ne PGSQL %then %do;
+ %put %str(WAR)NING: &flavour is not supported;
+ %return;
+%end;
+
%if &outref=0 %then %do;
- %put %str(WARN)ING: Please provide a fileref;
+ %put %str(WAR)NING: Please provide a fileref;
%return;
%end;
%if %mf_existfileref(&outref)=0 %then %do;
@@ -3497,8 +3512,9 @@ select count(*) into: nobs TRIMMED from &ds;
run;
%end;
-%local varlist;
+%local varlist varlistcomma;
%let varlist=%mf_getvarlist(&ds);
+%let varlistcomma=%mf_getvarlist(&ds,dlm=%str(,),quote=double);
/* next, export data */
data _null_;
@@ -3513,23 +3529,49 @@ data _null_;
%let var=%scan(&varlist,&i);
%let vtype=%mf_getvartype(&ds,&var);
%if &i=1 %then %do;
- put "insert into &outlib.&outds set ";
- put " &var="@;
+ %if &flavour=BASE %then %do;
+ put "insert into &outlib.&outds set ";
+ put " &var="@;
+ %end;
+ %else %if &flavour=PGSQL %then %do;
+ _____str=cats(
+ "INSERT INTO &outlib.&outds ("
+ ,symget('varlistcomma')
+ ,") VALUES ("
+ );
+ put _____str;
+ put " "@;
+ %end;
%end;
%else %do;
- put " ,&var="@;
+ %if &flavour=BASE %then %do;
+ put " ,&var="@;
+ %end;
+ %else %if &flavour=PGSQL %then %do;
+ put " ,"@;
+ %end;
%end;
%if &vtype=N %then %do;
- /* @todo - deal with nulls in other db flavours */
- /* from ._ to .z */
- put &var;
+ %if &flavour=BASE %then %do;
+ put &var;
+ %end;
+ %else %if &flavour=PGSQL %then %do;
+ if missing(&var) then put 'NULL';
+ else put &var;
+ %end;
%end;
%else %do;
_____str="'"!!trim(tranwrd(&var,"'","''"))!!"'";
put _____str;
%end;
%end;
- put ';';
+ %if &flavour=BASE %then %do;
+ put ';';
+ %end;
+ %else %if &flavour=PGSQL %then %do;
+ put ');';
+ %end;
+
if _n_=&nobs then put /;
run;
diff --git a/base/mp_ds2inserts.sas b/base/mp_ds2inserts.sas
index b964673..09e510a 100644
--- a/base/mp_ds2inserts.sas
+++ b/base/mp_ds2inserts.sas
@@ -20,6 +20,10 @@
located. If not provided, is ignored.
@param [out] outds= (0) The output table to load. If not provided, will
default to the table in the &ds parameter.
+ @param [in] flavour= (BASE) The SQL flavour to be applied to the output. Valid
+ options:
+ @li BASE (default) - suitable for regular proc sql
+ @li PGSQL - Used for Postgres databases
SAS Macros
@li mf_existfileref.sas
@@ -31,18 +35,29 @@
@author Allan Bowe (credit mjsq)
**/
-%macro mp_ds2inserts(ds, outref=0,outlib=0,outds=0
+%macro mp_ds2inserts(ds, outref=0,outlib=0,outds=0,flavour=BASE
)/*/STORE SOURCE*/;
%if not %sysfunc(exist(&ds)) %then %do;
- %put %str(WARN)ING: &ds does not exist;
+ %put %str(WAR)NING: &ds does not exist;
+ %return;
+%end;
+
+%if not %sysfunc(exist(&ds)) %then %do;
+ %put %str(WAR)NING: &ds does not exist;
%return;
%end;
%if %index(&ds,.)=0 %then %let ds=WORK.&ds;
+%let flavour=%upcase(&flavour);
+%if &flavour ne BASE and &flavour ne PGSQL %then %do;
+ %put %str(WAR)NING: &flavour is not supported;
+ %return;
+%end;
+
%if &outref=0 %then %do;
- %put %str(WARN)ING: Please provide a fileref;
+ %put %str(WAR)NING: Please provide a fileref;
%return;
%end;
%if %mf_existfileref(&outref)=0 %then %do;
@@ -73,8 +88,9 @@ select count(*) into: nobs TRIMMED from &ds;
run;
%end;
-%local varlist;
+%local varlist varlistcomma;
%let varlist=%mf_getvarlist(&ds);
+%let varlistcomma=%mf_getvarlist(&ds,dlm=%str(,),quote=double);
/* next, export data */
data _null_;
@@ -89,23 +105,49 @@ data _null_;
%let var=%scan(&varlist,&i);
%let vtype=%mf_getvartype(&ds,&var);
%if &i=1 %then %do;
- put "insert into &outlib.&outds set ";
- put " &var="@;
+ %if &flavour=BASE %then %do;
+ put "insert into &outlib.&outds set ";
+ put " &var="@;
+ %end;
+ %else %if &flavour=PGSQL %then %do;
+ _____str=cats(
+ "INSERT INTO &outlib.&outds ("
+ ,symget('varlistcomma')
+ ,") VALUES ("
+ );
+ put _____str;
+ put " "@;
+ %end;
%end;
%else %do;
- put " ,&var="@;
+ %if &flavour=BASE %then %do;
+ put " ,&var="@;
+ %end;
+ %else %if &flavour=PGSQL %then %do;
+ put " ,"@;
+ %end;
%end;
%if &vtype=N %then %do;
- /* @todo - deal with nulls in other db flavours */
- /* from ._ to .z */
- put &var;
+ %if &flavour=BASE %then %do;
+ put &var;
+ %end;
+ %else %if &flavour=PGSQL %then %do;
+ if missing(&var) then put 'NULL';
+ else put &var;
+ %end;
%end;
%else %do;
_____str="'"!!trim(tranwrd(&var,"'","''"))!!"'";
put _____str;
%end;
%end;
- put ';';
+ %if &flavour=BASE %then %do;
+ put ';';
+ %end;
+ %else %if &flavour=PGSQL %then %do;
+ put ');';
+ %end;
+
if _n_=&nobs then put /;
run;