Programs and macro libraries
Catalog programs, %include chains, shared macro libraries, Enterprise Guide projects, process flows, DATA steps, and procedures.
SAS workload modernization
SAS programs often carry more than transformation code. They can encode decades of business definitions, statistical procedures, macro-driven processing, data preparation rules, scheduled jobs, exception handling, and operational knowledge. Migrating that estate to Microsoft Fabric is a controlled redesign of workflows, analytical logic, storage, orchestration, and governance—not simply a language conversion exercise.
Office Solution AI Labs helps organizations assess SAS workloads and transition suitable processing to Microsoft Fabric. Engagements can combine portfolio discovery, code analysis, Pulse Convert automation, engineering review, Fabric-native implementation, data reconciliation, and staged deployment.
The destination may include Fabric notebooks using PySpark or Spark SQL, Warehouse SQL, Dataflow Gen2, Data Factory pipelines, and Lakehouse or Warehouse structures. Begin with an assessment or representative proof of concept to identify translation candidates, re-engineering needs, statistical review, and equivalence measures.
A SAS estate can span source code, data, scheduling, analytics, and operational knowledge. Those responsibilities do not all belong in the same Fabric item.
Some transformations are best implemented in Spark notebooks; relational processing may fit SQL; repeatable low-code shaping may fit Dataflow Gen2; orchestration belongs in pipelines. Statistical procedures may require a separate equivalence and implementation decision. Make business logic explicit and assign each responsibility to an appropriate target component.
Review the SAS-to-Fabric migration overview, then assess your own programs, dependencies, and validation needs with a representative workload.
A repository of .sas files alone does not reveal the full operating model. Discovery should identify what runs, what it depends on, and how its outputs are consumed before estimating conversion effort.
Catalog programs, %include chains, shared macro libraries, Enterprise Guide projects, process flows, DATA steps, and procedures.
Map libraries, permanent datasets, WORK outputs, formats, informats, catalogs, labels, schemas, and data types.
Identify database connections, pass-through SQL, input/output locations, runtime configuration, and generated code.
Map schedules, dependencies, batch scripts, manual triggers, failure recovery, reports, exports, and downstream users.
The output should be a dependency-aware migration register describing each workload's purpose, inputs, outputs, runtime assumptions, complexity, owner, validation requirements, and recommended target pattern—not just a file count.
DATA steps can perform row processing, filtering, conditional assignments, merges, BY-group operations, retained state, arrays, output routing, and dataset creation. Spark DataFrame operations are distributed and do not automatically share the same semantics.
| SAS pattern | Fabric-oriented candidate | Required review |
|---|---|---|
| DATA step filtering | DataFrame filter / SQL WHERE | Review missing-value and predicate semantics. |
| Assignments and derived columns | withColumn, expressions, or SQL projection | Check type conversion and evaluation behavior. |
| IF/THEN/ELSE | Conditional expressions / when | Preserve branch order and null behavior. |
| BY-group processing | Window functions or grouped operations | Validate sort order, first/last logic, and ties. |
| RETAIN and stateful logic | Window, aggregation, ordered processing, or redesign | Test state, partitioning, and execution order. |
| MERGE by keys | DataFrame join or explicit match-merge logic | SAS match-merge semantics may differ from Spark joins. |
| SET / concatenation | Union or append patterns | Align schemas and missing columns deliberately. |
| Arrays and multiple OUTPUT targets | Spark expressions, redesigned logic, conditional writes, or branching | Validate index behavior and output completeness. |
| PROC SORT | DataFrame ordering or partition strategy | Review global order and scalability requirements. |
SAS match-merge, BY-group processing, missing-value comparisons, and implicit ordering can differ from Spark joins and distributed operations. Create explicit test fixtures for the constructs used.
SAS programs can combine SAS statements with macro-language processing. Identify static transformations versus generated branches, macro parameters and scope, dynamic names and paths, conditional code generation, environment configuration, macro functions, and error paths.
A macro is not automatically equivalent to a Python function. Some macros generate executable code; others construct strings or values. Preserve when and how generated logic is evaluated.
Distinguish SQL processed by SAS from pass-through SQL executed by an external database. Potential targets include Fabric Warehouse SQL, Spark SQL, PySpark DataFrames, source-side SQL, pipeline activities, and Dataflow Gen2.
Review dialects, functions, date and string behavior, joins, implicit conversions, pushdown, and transaction assumptions. Do not translate database-specific pass-through code blindly into Spark SQL.
Fabric offers several engineering and transformation experiences. Choose by workload responsibility rather than converting every SAS program into one notebook.
Raw and curated data using OneLake-backed files and Delta tables.
Define data layers, owners, and retention.
Code-first transformations, custom logic, and data science using PySpark or Spark SQL.
Confirm distributed execution is appropriate and maintainable.
Relational data structures and SQL-centric analytics.
Determine whether consumers need curated SQL data.
Low-code preparation and supported Power Query transformations.
Use for logic well suited to the available transformations.
Ingestion, scheduling, dependencies, and orchestration.
Recreate parameters, triggers, retries, and failure paths.
Governed measures and analytical consumption.
Identify metrics requiring shared definitions.
SAS libraries abstract storage and access. Make the Fabric target explicit: map paths to connections, OneLake, Lakehouse tables, or Warehouse schemas; distinguish permanent datasets from temporary WORK outputs; and recreate formats, informats, labels, mappings, lineage, and ownership where they affect business meaning.
Classify analytical workloads as data preparation, statistical computation, scoring/inference, business decision rules, or presentation. Determine whether a supported target method exists, SAS should remain temporarily, or a separately validated redevelopment is required.
A target implementation can be operationally similar without being mathematically identical. Document differences and obtain appropriate specialist approval.
Separate data movement from code conversion. Determine where data lives, how it is accessed, whether it should be copied or queried, and how raw and curated outputs should be stored.
Source connectors, authentication, batch versus incremental ingestion, formats, schema evolution, Lakehouse versus Warehouse, zones, partitioning, retention, and archival.
Triggers, input readiness, parameters, execution order, retries, idempotency, backfill, restart, logging, alerts, output publication, and SLAs.
Microsoft Entra identities, workspace/item permissions, data-level restrictions, secrets, environment separation, classification, lineage, audit, CI/CD, and asset ownership.
Align source/target snapshots, parameters, filters, and execution dates; classify differences and capture evidence and business sign-off.
For large data, combine agreed sampling, partition aggregates, hashes, business controls, and targeted record comparisons as appropriate. Do not describe a sampled method as exhaustive proof.
Pulse Convert is Office Solution AI Labs' migration accelerator. Its Microsoft Marketplace listing describes SAS workload discovery and conversion toward Fabric assets such as PySpark notebooks, Fabric SQL, Dataflows Gen2, pipelines, and Lakehouse tables. The listing also describes dependency analysis and complexity/readiness information.
Automation can reduce repetitive translation and asset creation, but does not remove source interpretation, architecture design, statistical validation, security review, or production acceptance. Coverage varies by syntax, macro behavior, procedure, external dependency, and input quality.
A proof of concept should report conversion coverage by pattern and review effort for each class. One aggregate automation percentage can conceal very different complexity across DATA steps, macros, SQL, and statistical procedures.
View the SAS-to-Fabric Marketplace listing| SAS estate characteristic | Migration question | Possible Fabric direction |
|---|---|---|
| DATA step transformations | Is logic row-oriented, ordered, or stateful? | PySpark, Spark SQL, or SQL after semantic review. |
| PROC SQL | Is SQL SAS-processed or database pass-through? | Fabric SQL, Spark SQL, or retain source execution. |
| Macro-heavy programs | Does a macro generate code dynamically? | Parameterized notebook, reusable function, pipeline parameter, or redesign. |
| Permanent SAS datasets | Which outputs are reusable and governed? | Lakehouse Delta table or Warehouse table. |
| WORK intermediates | Are these outputs transient? | Intermediate processing rather than permanent storage, where appropriate. |
| SAS formats and informats | Do they change parsing, grouping, or displayed values? | Reference mappings, explicit transformations, or presentation logic. |
| Statistical procedures | Is there a validated target implementation? | Validated library/model, specialized compute, or controlled SAS coexistence. |
| Batch schedules | What triggers and dependencies exist? | Data Factory pipeline or integrated scheduling pattern. |
| Database pass-through | Where should computation execute? | Source database, Fabric SQL/Spark, or hybrid. |
| Reports and exports | Are outputs interactive, fixed-layout, or downstream files? | Power BI, paginated report, governed table, or workflow output. |
| Operational scripts | What restart, alert, and support behavior is required? | Pipeline controls, logging, monitoring, and runbooks. |
Set objectives such as reducing the SAS footprint, modernizing data engineering, consolidating analytics, improving governance, or enabling new workloads. Define what equivalent means for each critical output.
Deliverables: Scope, success criteria, owners, assumptions, data boundaries, and decision log.
Identify programs, macros, datasets, libraries, schedules, external inputs, statistical procedures, and downstream consumers. Reconstruct execution chains when documentation is incomplete.
Deliverables: Workload catalog, dependency map, complexity classification, and risk register.
Choose Fabric components, storage zones, transformation ownership, orchestration, identity, environments, and reusable code standards.
Deliverables: Architecture, component mapping, data conventions, security matrix, and operational design.
Select realistic workloads that exercise macro generation, DATA step merge/BY behavior, PROC SQL pass-through, formats, statistical procedures, and restart requirements.
Deliverables: Candidate assets, conversion coverage, reconciliation results, exceptions, and revised estimates.
Move related jobs in dependency order. Convert supported code, refactor shared logic, rebuild scheduling, and validate data and operations.
Deliverables: Agreed Fabric assets, test suites, exception register, lineage, and runbooks.
Run business acceptance and parallel processing for critical workloads, monitor outputs and runtime, train users, and approve retirement of SAS dependencies.
Deliverables: Signed acceptance, production release, monitoring, support ownership, and retirement plan.
Select pilots that expose difficult patterns, not only simple SQL jobs. A successful simple program does not establish portfolio-wide conversion readiness.
Share source code, data, and configuration through approved secure channels. Do not include passwords, tokens, private keys, or production secrets in assessment files or unsecured uploads.
These are hypothetical design examples, not customer case studies.
SAS DATA steps and PROC SQL prepare period balances, join reference tables, and generate exception datasets. Candidate design: ingestion pipeline, PySpark or SQL transformations, curated tables, and explicit reconciliation and close-calendar orchestration.
Macro loops generate region-specific queries and files. Candidate design: parameterized pipeline/notebook, configuration table, reusable transformation, and governed output naming.
Custom formats map codes to business categories. Candidate design: governed mapping table or explicit logic with effective dates and defined unknown-code behavior.
A procedure or custom code produces scores and diagnostics. Evaluate supported target libraries, a defined SAS interim period, or separately validated redevelopment.
A nightly job depends on file arrival and can require manual rerun. Candidate design: pipeline dependency checks, parameters, retry policy, idempotent writes, logging, alerting, and recovery runbooks.
DATA step state, BY-group, missing-value, or match-merge behavior may change. Test the semantic constructs used and inspect generated code.
Generated branches, paths, and table names can disappear or behave differently. Resolve dependencies and distinguish code generation from value substitution.
This can create excess storage and unclear ownership. Classify transient versus reusable outputs.
Models or inference may differ despite successful execution. Involve statistical specialists and define comparison metrics and tolerances.
Source pushdown, specialized database behavior, or performance can be lost. Inspect pass-through SQL and choose where computation should execute.
Schedules, recovery, or duplicate prevention can break. Migrate triggers, dependencies, retry, idempotency, monitoring, and runbooks too.
Complex macros or specialized procedures can be underestimated. Measure coverage by construct and workload class in the proof of concept.
Hidden downstream files or manual processes can break. Maintain a consumer register and use evidence-based parallel runs and retirement sign-off.
A credible estimate cannot be based only on program count or lines of code. Effort is influenced by DATA step and BY-group complexity, PROC SQL and pass-through dependencies, macro-generated logic, statistical procedures, formats, data volume, schedules, security, automation coverage, UAT, and stakeholder availability.
Assess recurring SAS and target Fabric costs separately from one-time engineering. Capacity, user licensing, data movement, source systems, storage, monitoring, and operations affect the business case. Verify current tenant requirements and pricing rather than assuming savings.
Automation can accelerate supported discovery, code translation, and target asset creation. It cannot guarantee equivalent behavior for every macro, DATA step, SQL dialect, statistical procedure, or operational dependency. A representative proof of concept should establish actual coverage and required engineering.
Depending on the workload, candidate targets include Fabric notebooks using PySpark or Spark SQL, Fabric Warehouse SQL, Dataflow Gen2 transformations, Data Factory pipelines, and Lakehouse or Warehouse tables. Choose the target by workload responsibility rather than a fixed one-to-one rule.
Not automatically. Row processing, BY-group behavior, RETAIN, match-merge, missing values, ordering, and output routing can differ from Spark DataFrame and distributed execution semantics. Test each relevant pattern with controlled data.
Resolve macro dependencies and determine whether each macro generates SAS code, substitutes values, or controls execution. Then redesign it as a parameterized notebook, reusable Python function, pipeline parameter, configuration-driven workflow, or another target pattern. Inspect and validate generated code.
Some SQL can be translated, but SAS SQL and database pass-through SQL have different execution contexts. Review dialect, source functions, pushdown, type behavior, and performance before choosing Fabric SQL, Spark SQL, or retaining source-side execution.
Formats can affect category labels and grouping; informats can affect input parsing. Preserve relevant behavior using explicit transformation logic, mapping tables, data types, and presentation rules. Validate raw and displayed values.
Some analytical logic can be reimplemented with supported libraries or target-native methods, but procedure coverage and statistical equivalence vary. Model fitting, diagnostics, missing-value behavior, convergence, and output precision require specialist validation.
No. Consider source connectivity, ingestion, retention, reuse, performance, governance, and downstream needs. Some data may be ingested to OneLake; other processing may remain at the source or use a hybrid design during transition.
Map triggers, dependencies, parameters, retries, restart behavior, alerts, and outputs. Fabric Data Factory pipelines can orchestrate supported activities, including notebooks, but operational behavior must be designed and tested.
Timing depends on workload count and complexity, macro and procedure usage, data sources, statistical validation, operational dependencies, target architecture, and business acceptance. A representative pilot gives a stronger estimate than lines of code alone.
A scoped assessment can include inventory, dependency reconstruction, code-pattern analysis, complexity classification, Fabric architecture options, automation feasibility, validation requirements, a risk register, pilot selection, and a phased roadmap. Confirm deliverables in the engagement scope.
Yes. A controlled parallel run can validate critical outputs and operating behavior. Define the authoritative system for each output, align snapshots and parameters, record discrepancies, and specify retirement criteria.
Not necessarily. Compare actual licensing, capacity, data infrastructure, migration effort, support, governance, statistical workloads, and operating costs. Platform consolidation does not automatically reduce total cost.
Choose a realistic mix of DATA steps, macro logic, PROC SQL, source pass-through, formats, statistical computation, and scheduling. Measure conversion coverage, review effort, result differences, runtime, recovery, and user acceptance.
Pulse Convert is Office Solution AI Labs' migration accelerator. Its Marketplace listing describes SAS workload discovery and conversion toward Fabric assets. Confirm current scope, supported constructs, trial terms, and performance or accuracy claims with the product owner.
Preserve the meaning of data and analytical outputs while improving how workloads are organized, executed, governed, and supported. Start with an inventory, target architecture, and pilot that tests difficult code and operational patterns.
We are an authorized implementation partner of Snowflake, Databricks, Amazon, Automation Anywhere, Denodo, DataDog, New Relic, and Elastic.