AI Proof Pricing Book a demo Get the free SAS assessment

Targets

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.

Updated

Architecture

How does SAS become Snowflake? 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 where it helps
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

MigryX AI handles the logic parsers cannot resolve alone, and every change it makes goes through the same parity checks. It runs on a model you approve, 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

How is the conversion proven? 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 →
18
SAS engagements
16
on Spark

Proven with regulated enterprises

28 regulated enterprises, including six global systemically important banks, have modernized with MigryX. Customer names are shared under NDA in a demo, with reference calls on request.

See all engagements →