diff --git a/hist/2.2/sqlinds.zip b/hist/2.2/sqlinds.zip new file mode 100644 index 0000000..dbf6341 Binary files /dev/null and b/hist/2.2/sqlinds.zip differ diff --git a/sqlinds.md b/sqlinds.md new file mode 100644 index 0000000..4d0eb4e --- /dev/null +++ b/sqlinds.md @@ -0,0 +1,175 @@ +- [The SQLinDS package [ver. 2.2]](#sqlinds-package) +- [Content description](#content-description) + * [library `dsSQL`](#library-dssql) + * [`%dsSQL_inner()` macro](#dssql-inner-macro) + * [`%SQL()` macro](#dssql-inner-macro) + * [`dsSQL()` function](#dssql-function) + * [License](#license) + +--- + +# 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 data step, 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) + +--- + +Package contains: +1. libname dssql +2. macro dssql_inner +3. macro sql +4. function dssql + +Required SAS Components: + *Base SAS Software* + +*SAS package generated by generatePackage, version 20220830* + +The SHA256 hash digest for package SQLinDS: +`96D0EFE02DF1AE0D7D875A10CAF7EF63CDEF85DD0CF9418934BEFAF0C067D453` + +--- +# 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 uniquely 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 query 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. + +### SYNTAX: ################################################################### +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +dsSQL(unique_index_2, query) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Arguments description**: + +1. `unique_index_2` - *Numeric*, internal variable, a unique index for views. + +2. `query` - *Character*, internal variable, contains query text. + +--- + +## 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. + +--- diff --git a/sqlinds.zip b/sqlinds.zip new file mode 100644 index 0000000..dbf6341 Binary files /dev/null and b/sqlinds.zip differ