/*-------------------<-- Start of Description-->---------------------\
| Fast Retrieve Data from Device Database, very fast, more than 8 |
| times faster than the regular query; |
|---------------------<-- End of Description-->----------------------|
|--------------------------------------------------------------------|
|------------<-- Start of Files or Arguments Needed-->---------------|
| libname: a defined database library name; |
| dbtable: the table name in the database; |
| where: the where condition, if you want to select only a subset of |
| all the entire table; |
| dbkey: the key of the database table; |
| orderby: sort the output data by; |
| schema: the schema, such as the "acedaf$current" for table |
| "acedaf$current.pat_dvn" in the OC; |
| outdata: the output dataset created; |
|-------------<-- End of Files or Arguments Needed-->----------------|
|--------------------------------------------------------------------|
|------------------<-- Start of Files Created-->---------------------|
| Example: |
| %macro sqlconcat(indata=, var=, outvar=); |
| %global &outvar; |
| %local localv1; |
| proc sql noprint; |
| select distinct &var |
| into :localv1 separated by '", "' |
| from &indata |
| where &var ne ' ' |
| order by &var.; |
| quit; |
| %let localv1="&localv1"; |
| %let &outvar=(&localv1); |
| %put &outvar is &&&outvar; |
| %mend sqlconcat; |
| %sqlconcat(indata=acedcrf.implant, var=serialno, |
| outvar=acedallserial);|
| libname DVdbms odbc dsn='device' user=dr password=dr |
| access=readonly connection=GLOBALREAD; |
| %query(libname=DVdbms, dbtable=episode STD_PARAM_PACING, |
| where=(comp_sernum in &acedallserial), dbkey=comp_sernum, |
| orderby=comp_sernum, outdata=episode STD_PARAM_PACING); |
\-------------------<-- End of Files Created-->---------------------*/
%macro query(libname=,dbtable=,where=,dbkey=,schema=,orderby=,outdata=&dbtable);
/*--------------------------------------------\
| Copy Right: Duo Zhou; |
| Created: 10-11-2001 8:43pm; |
| Purpose: Retrieve a table from a Database; |
\--------------------------------------------*/
%local ndsns localvname _i_ _j_;
%let dblib=%sysfunc(dequote(&libname));
%if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&orderby))))), %str(%()) eq 1) and
(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(&orderby))))))), %str(%))) eq 1) %then
%let orderby=%substr(%quote(%trim(%quote(%left(%quote(&orderby))))), 2, %eval(%length(%trim(%quote(%left(%quote(&orderby)))))-2));
%let ndsns=1;
%let dbtab1=%qscan(&dbtable, &ndsns, %str( ));
%let data1=%qscan(&outdata, &ndsns, %str( ));
%do %while(%length(&&dbtab&ndsns) gt 0);
%let ndsns=%eval(&ndsns+1);
%let dbtab&ndsns=%qscan(&dbtable, &ndsns, %str( ));
%let data&ndsns=%qscan(&outdata,&ndsns,%str( ));
%if &&data&ndsns eq %then %let data&ndsns=&&dbtab&ndsns;
%end;
%let ndsns =%eval(&ndsns-1);
%if (%quote(&schema) ne) %then %let schema="%trim(%nrbquote(%left(%nrbquote(%sysfunc(dequote(&schema))))))";
%do _i_=1 %to &ndsns;
proc sql;
Create table &&data&_i_ as
Select *
from &dblib..&&dbtab&_i_
%if (%quote(&dbkey) ne) or (%quote(&schema) ne) %then %do;
(%if (%quote(&dbkey) > 0) %then %do; dbkey=&dbkey %end;
%if (%quote(&schema) ne) %then %do; schema=&schema %end;)
%end;
%if (%length(&where) > 0) %then %do; where &where %end;
%if (%length(&orderby)> 0) %then %do; order by &orderby %end;;
quit;
%end;
%mend query;