Targets
Warehouses
Runtimes
Before migration
After migration
DATA step and PROC SQL parsed structurally. Emitted as set-based BigQuery SQL and Dataform models. Cloud Composer replaces the SAS scheduler.
Deterministic parsers read the SAS estate and emit native Google Cloud code, not SAS rehosted on a GCE VM.
SAS programs → SAS2PY parser → BigQuery + Dataform + Composer
SAS2PY Parser
Deterministic parse
AI where it helps
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.
BigQuery bills the query, not the box. No cluster to size for month-end.
Dataform models are versioned, tested, and have declared dependencies.
The modernization lands inside your project, with IAM and column-level security from the parsed lineage.
A DATA step running total with a BY-group reset, emitted as a window function, not a retained variable.
/* SAS running balance */ data gold; set txn; by account_id month; if first.month then bal = 0; bal + amount; run;
-- RETAIN → window function
SELECT account_id, month, amount,
SUM(amount) OVER (
PARTITION BY account_id, month
ORDER BY txn_date
ROWS UNBOUNDED PRECEDING
) AS bal
FROM txn;
RETAIN and FIRST. become a window frame. The BY-group is a PARTITION BY.
| SAS | Google Cloud | Notes |
|---|---|---|
| PROC SQL | BigQuery SQL | Standard SQL emit |
| DATA step RETAIN | Window functions | Running totals |
| Macro | Dataform SQLX | Parameterized models |
| SAS dataset | BigQuery table | Partition + cluster |
| SAS Grid | Cloud Composer | DAG orchestration |
SAS output compared to Google Cloud output: row by row, column by column. Differences flagged before sign-off.
See how Data Matching works →Customer names are shared under NDA in a demo, with reference calls on request.
See all engagements →