Connecting SAS to SQL Server or Azure SQL
To connect SAS or SAS Viya to SQL Server or Azure SQL you can either use:
- The SAS/ACCESS Interface to Microsoft SQL Server.
–Or–
- The SAS/ACCESS Interface to ODBC along with a third party SQL Server ODBC driver.
Note that the SAS/ACCESS Interface to Microsoft SQL Server also uses an ODBC driver. The difference between the two interfaces is that the SAS/ACCESS Interface to Microsoft SQL Server has an ODBC driver bundled with it, the SAS/ACCESS Interface to ODBC requires you to obtain an ODBC driver separately (which means that you're not limited to SQL Server should your requirements change).
This article covers the SAS/ACCESS Interface to ODBC.
To check whether your SAS distribution includes the SAS/ACCESS Interface to ODBC, use this SAS code:
proc SETINIT; run;
This lists all the installed SAS software. Check the command's output for:
SAS/ACCESS Interface to ODBC
If SAS/ACCESS Interface to ODBC isn't listed, contact your SAS sales representative.
If your SAS distribution does include the SAS/ACCESS Interface to ODBC, obtain a SQL Server ODBC driver that matches your SAS platform and architecture.
This article describes using SAS with our SQL Server ODBC driver, which:
- Meets the requirements for SAS
- Uses the native SQL Server protocol TDS (just like the SAS/ACCESS Interface to Microsoft SQL Server).
- You can try for free.
Follow these steps, to connect SAS to SQL Server:
- From the Easysoft web site, download the SQL Server for your SAS platform.
If your version of SAS is 32-bit, download the 32-bit version of the ODBC driver. If your version of SAS is 64-bit, download the 64-bit version of the ODBC driver. To check your SAS architecture, run this SAS code:
%PUT %SYSFUNC(GETOPTION(SYSADDRBITS));
If this command returns
64
, SAS is 64-bit. If this command returns32
, SAS is 32-bit. - As root, install the SQL Server ODBC driver on your SAS machine.
- The installation runs
licshell
, which lets you obtain a trial license for the SQL Server ODBC driver. - Post-installation, configure a SQL Server ODBC driver data source, which is where you specify the connection details for your SQL Server instance. Do this in the
odbc.ini
file forSYSTEM
data sources. For example:$ odbcinst -j unixODBC 2.3.4 DRIVERS............: /etc/odbcinst.ini SYSTEM DATA SOURCES: /etc/odbc.ini $ sudo vi /etc/odbc.ini % more /etc/odbc.ini [SQLSERVER_SAMPLE] Driver=Easysoft ODBC-SQL Server Description=Easysoft SQL Server ODBC driver Server=my_sql_server_machine\sqlexpress Database=pubs User=sa Password=1234abcd
- Test the ODBC driver connection outside of SAS. For example:
cd /usr/local/easysoft/unixODBC/bin ./isql.sh -v SQLSERVER_SAMPLE
Correct any errors before trying to connect from SAS. If you can't get the ODBC connection working with isql, you won't be able to get it working from SAS.
For help with some common errors, refer to these Easysoft articles:
- In your SAS environment file (for example,
sasenv_local
,sasenv_deployment
,cas_usermods.settings
, orworkspaceserver_usermods.sh
) configure the environment so that SAS can load the unixODBC Driver Manager and SQL Server ODBC driver. For example:export ODBCSYSINI=/etc export ODBCINI=odbc.ini export ODBCINSTINI=odbcinst.ini export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/easysoft/sqlserver:/usr/local/easysoft/lib:/usr/local/easysoft/unixODBC/lib
If you didn't install the SQL Server ODBC driver under
/usr/local
, edit theLD_LIBRARY
entry and setEASYSOFT_ROOT
. For example:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/easysoft/sqlserver:/opt/easysoft/lib:/opt/easysoft/unixODBC/lib export EASYSOFT_ROOT=/opt
Note The SAS/ACCESS Interface to ODBC is linked against the unixODBC Driver Manager. When you specify the ODBC data source for SQL Server in SAS, the Driver Manager loads the SQL Server ODBC driver, which then connects to SQL Server. The unixODBC Driver Manager is included in the SQL Server ODBC driver distribution.
- Use either a
LIBNAME
statement orPROC SQL Pass-Through
to work with SQL Server data in SAS.
Using the LIBNAME
statement
Assign a SAS library reference (libref
) to the ODBC data source SQLSERVER_SAMPLE
:
LIBNAME mssqlodbc ODBC DSN="SQLSERVER_SAMPLE";
After running this command, check the SAS log. If the connection is successful, you'll get:
NOTE: Libref mssqlodbc was successfully assigned as follows: Engine: ODBC Physical Name: SQLSERVER_SAMPLE
If you get something like:
Data source name not found and no default driver specified ERROR: Error in the LIBNAME statement.
review steps 5 and 6 in the procedure shown earlier.
Examples
Create a dsn-less connection:
LIBNAME dsnlessodbc ODBC NOPROMPT="DRIVER=Easysoft ODBC-SQL Server;Server=my_sql_server_machine\sqlexpress;UID=sa;PWD=1234abcd;Database=pubs;"
This removes the need to create an ODBC data source or set ODBCSYSINI
, ODBCINI
, and ODBCINSTINI
in your SAS environment.
Create a read-only connection:
LIBNAME mssqlodbc ODBC DSN="SQLSERVER_SAMPLE" READONLY=YES;
List tables:
proc datasets lib=mssqlodbc; run;
Access a particular table's data
data authors; set mssqlodbc.authors; run;
Run a query:
proc print data=mssqlodbc.publishers; where pub_name='New Moon Books'; run;
Read remote SQL Server data into a local table:
proc SQL; create table local_authors as select * from mssqlodbc.authors; quit;
Using PROC SQL Pass-Through
Examples
Run a query:
proc sql; connect to odbc (dsn="SQLSERVER_SAMPLE"); select * from connection to odbc ( select * from publishers where pub_name = 'New Moon Books' ); disconnect from odbc; quit;
Use a SAS macro variable in a query:
proc sql; %let royalty = 100; connect to odbc (dsn="SQLSERVER_SAMPLE"); select * from connection to odbc ( select * from title where royalty = &royalty ); disconnect from odbc; quit;
Insert data:
proc sql; connect to odbc (dsn="SQLSERVER_SAMPLE"); execute ( insert into publishers (pub_id, pub_name, city, state, country) values (1000, 'ACME Publishers', 'Boston', 'MA', 'USA') ) by odbc; disconnect from odbc; quit;
Run a stored procedure:
proc sql; connect to odbc (dsn="sqlserver_sample"); create table royalty as select * from connection to odbc ( exec byroyalty 60 ); disconnect from odbc; quit;