From c10851e9ef971219eeac7708fd9211e0fa159f0c Mon Sep 17 00:00:00 2001 From: yabwon Date: Mon, 14 Sep 2020 17:07:11 +0200 Subject: [PATCH] SQLinDS, version 2.2 --- packages/SHA256_for_packages.txt | 2 + packages/sqlinds.md | 135 +++++++++++++++++++++++++++++++ packages/sqlinds.zip | Bin 11328 -> 11321 bytes 3 files changed, 137 insertions(+) create mode 100644 packages/sqlinds.md diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 6d6edc7..d32174d 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,5 @@ +/* 20200914 */ +SQLinDS: DD5E319EB5AA29C7054EC428072F987E77C29D36874DED1AE5C62E4B300845EB /* 20200911 */ sqlindsdemo: CCA3CB51587E30D1A4338EAF732EF03E0922918AAA21C3ECF85CABE93CD2FB15 macroArray: 5C9208ADD091E354794C24FA830F527D17CFC758C24CB77BF2154949059F7E6F diff --git a/packages/sqlinds.md b/packages/sqlinds.md new file mode 100644 index 0000000..63886a9 --- /dev/null +++ b/packages/sqlinds.md @@ -0,0 +1,135 @@ + +# The SQLinDS package [ver. 2.2] ############################################### + +The **SQLinDS** package is an implementation of +the *macro-function-sandwich* concept introduced in the +*"Use the Full Power of SAS in Your Function-Style Macros"*, +the article by *Mike Rhoads (Westat, Rockville)*. + +Copy of the article is available at: +[https://support.sas.com/resources/papers/proceedings12/004-2012.pdf](https://support.sas.com/resources/papers/proceedings12/004-2012.pdf) + +Package provides ability to *execute* SQL queries inside a datastep, e.g. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} + data class; + set %SQL(select * from sashelp.class); + run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +See the help for the `%SQL()` macro to find more examples. + +### Content ################################################################### + +SQLinDS package contains the following components: + +1. `%SQL()` macro - the main package macro available for the User +2. `dsSQL()` function (internal) +3. `%dsSQL_inner()` macro (internal) +4. Library `DSSQL` (created as a subdirectory of the `WORK` library) + +Required SAS Components: + Base SAS Software + +*SAS package generated by generatePackage, version 20200911* + +The SHA256 hash digest for package SQLinDS: +`DD5E319EB5AA29C7054EC428072F987E77C29D36874DED1AE5C62E4B300845EB` + + +### Content description ####################################################### + +## >>> library `dsSQL`: <<< ################################### + +The dsSQL library stores temporary views +generated during the `%SQL()` macro execution. + +If possible a subdirectory of the `WORK` location is created, like: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} +LIBNAME dsSQL BASE "%sysfunc(pathname(WORK))/dsSQLtmp"; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +if not possible, then redirects to the `WORK` location, like: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} +LIBNAME dsSQL BASE "%sysfunc(pathname(WORK))"; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## >>> `%dsSQL_Inner()` macro: <<< ############################################# + +**Internal** macro called by `dsSQL()` function. +The macro generates a uniqualy named sql view on the fly +which is then stored in the `DSSQL` library. + +Recommended for *SAS 9.3* and higher. + + +## >>> `%SQL()` macro: <<< ##################################################### + +The *main* macro which allows to use +SQL queries in the data step. + +Recommended for *SAS 9.3* and higher. + +Based on the article *"Use the Full Power of SAS in Your Function-Style Macros"* +by *Mike Rhoads* (Westat, Rockville), available at: +[https://support.sas.com/resources/papers/proceedings12/004-2012.pdf](https://support.sas.com/resources/papers/proceedings12/004-2012.pdf) + +### SYNTAX: ################################################################### +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} +%sql() +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The sql querry code is limited to *32000* bytes. + +### EXAMPLES: ################################################################# + +**EXAMPLE 1**: simple SQL query +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} +data class_subset; + set %SQL(select name, sex, height from sashelp.class where age > 12); +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 2**: query with dataset options +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} +data renamed; + set %SQL(select * from sashelp.class where sex = "F")(rename = (age=age2)); +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**EXAMPLE 3**: dictionaries in the data step +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.sas} +data dictionary; + set %SQL(select * from dictionary.macros); +run; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## >>> `dsSQL()` function: <<< ################################################# + +**Internal** function called by the `%SQL()` macro. +The function pass a query code from the `%SQL()` +macro to the `%dsSQL_Inner()` internal macro. + +Recommended for *SAS 9.3* and higher. + + +## License #################################################################### +Copyright (c) 2012 Mike Rhoads + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/sqlinds.zip b/packages/sqlinds.zip index 7cd56c4f66235cb3d8838e42e0ed1b3b570b884e..987c0452c6b0a491bcda38f5455703be9de33b8d 100644 GIT binary patch delta 7952 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