Databricks Atlas Case Studies Pricing Start a pilot

Campaign

Warehouses

Runtimes

Beyond SAS

Convert SAS programs to Snowflake SQL

DATA step, PROC SQL, and macros parsed structurally. Emitted as Snowflake SQL and Snowpark where SQL is not enough. Tasks replace the SAS scheduler.

Architecture

SAS in. Snowflake out.

Deterministic parsers read the SAS estate and emit native Snowflake code — not SAS replayed through a warehouse connector.

SAS programs → SAS2PY parser → SQL + Snowpark + Tasks

SAS
Base SAS DATA step / macros
DI Studio Jobs + mappings
EG / EM Projects + flows
Viya / CAS CASL + actions
SAS2PY Parser
Deterministic parse AI optional
Row-level parity Before cutover
SQL emit Set-based procedures
Snowpark emit Where SQL is not enough
Snowflake
Snowflake SQL DDL from SAS schemas
Snowpark Python DataFrames
Tasks Replaces SAS Grid
Streams Change data
Git + clone Dev to prod
RBAC + tags Column security

AI is an optional add-on, off by default — the conversion runs end to end without it, air-gapped if your estate requires it.

Why Snowflake

The warehouse should run the job, not host SAS

PROC SQL already wants to be the warehouse

Most SAS estates are SQL wearing a SAS costume. We emit native Snowflake SQL so the compute that bills you is the compute that runs the join.

Macros are not a package manager

Expanded once, then written as procedures and views a Snowflake engineer can own.

Grid scheduling is a standing cost

SAS Grid queues become Snowflake Tasks. No extra scheduler appliance.

Parser output

PROC SQL to Snowflake

A SAS PROC SQL join with a calculated segment — emitted as Snowflake SQL, not a cursor loop.

SAS
/* SAS PROC SQL */
proc sql;
  create table gold as
  select c.cust_id, t.amount,
    case when t.amount > 1000 then 'GOLD'
         else 'STD' end as segment
  from cust c, txn t
  where c.cust_id = t.cust_id;
quit;
SAS2PY
converts
Snowflake SQL
-- PROC SQL → Snowflake
CREATE OR REPLACE TABLE gold AS
SELECT c.cust_id, t.amount,
  CASE WHEN t.amount > 1000 THEN 'GOLD'
       ELSE 'STD' END AS segment
FROM cust c
JOIN txn t ON c.cust_id = t.cust_id;

Implicit SAS join becomes an explicit JOIN. The CASE is already the target language.

Coverage

SAS to Snowflake — artifact mapping

SASSnowflakeNotes
PROC SQLSnowflake SQLJoins, GROUP BY, QUALIFY
DATA stepSQL / SnowparkSet-based rewrite
MacroExpanded SQLNo leftover %LET
SAS datasetSnowflake tableDDL from schemas
SAS GridTasks + StreamsWarehouse-native
Formats / informatsMapped typesDate and numeric
Validation

Every conversion validated to row-level parity

SAS output compared to Snowflake output — row by row, column by column. Differences flagged before sign-off.

See how Data Matching works →
3,100
programs
12 mo
duration
$6.8M
saved
Audit
ready

Global Pharma: 3,100 SAS programs to Snowflake

Clinical SAS programs modernized to Snowflake SQL with audit-ready validation evidence for regulated data. $6.8M saved in 12 months.

Read the case study →