SSIS migration, run by an agent fleet.
The Documenter reads SQL Server Integration Services (the logic, not just the labels) and writes it to the knowledge base. Then the fleet builds, tests and operates the result on Microsoft Fabric or Databricks, iterating until the tests pass, with your experts approving every gate.
What the Documenter reads
An SSIS package is an XML document on disk, but the Documenter doesn’t stop at the element names. The whole point of the assessment gate is to read the logic a package encodes, not just the labels Visual Studio gave it. A .dtsx file describes control flow, data flows, connection managers, variables, parameters and configurations; an .ispac bundles the project’s packages plus a manifest and parameter definitions. We parse both, then reconstruct what actually runs.
Two engines, documented separately
A package has two layers that execute on different engines, so the Documenter treats them as two graphs. The control flow is the orchestration layer: tasks such as Execute SQL Task, Script Task, Data Flow Task and Execute Package Task, plus Sequence, For Loop and Foreach Loop containers that each hold their own nested control flow. The Data Flow is the in-memory ETL pipeline, and it only exists inside a Data Flow Task, with its own instance of the data-flow engine per task. Reading them together would lose the seam where orchestration hands off to row-by-row processing.
Precedence constraints are the logic, not decoration
The edges of the control-flow graph are precedence constraints, and their properties carry the branching logic. The Documenter captures the value (Success, Failure, or Completion), the EvalOp (Constraint, Expression, Expression and Constraint, or Expression or Constraint), and the LogicalAnd flag that decides whether multiple incoming constraints are AND-ed or OR-ed. That last flag is the crux of merge logic: “run Task D only if A succeeded AND B failed AND C succeeded” is invisible unless you read it. Packages are never linked by precedence constraints, so cross-package orchestration is followed through the Execute Package Task instead.
Inside the Data Flow
A data flow is sources, transformations and destinations connected by paths. The Documenter records which transformations are synchronous (row-by-row, reusing the buffer, like Derived Column or Conditional Split) versus asynchronous (blocking or semi-blocking, like Sort, Aggregate or Merge Join), because the asynchronous ones are the performance pivot points and the ones whose buffer-based semantics (sorted inputs, error outputs, lineage-tracked columns) must be reproduced as set-based SQL or Spark transformations where there is no row-buffer model.
Expressions, variables and scope
SSIS has its own expression language, C-like rather than T-SQL, used in precedence constraints, derived columns, conditional splits, the For Loop container and property expressions. The Documenter resolves these because they dynamically set properties at runtime. It also records the things that bite on rebuild: variable names are case-sensitive; variables carry scope and can be EvaluateAsExpression = True; the User and System namespaces resolve with ::; and the evaluator never implicitly converts to Boolean, with True represented as -1 in the Visual Basic convention. Parameters are followed through their design default, server default and environment-reference chain in the SSISDB catalog.
The two highest-risk constructs
Two things are read with extra care because they hide business logic. Script Tasks and Script Components are .NET code in a ScriptMain class, reached through the Dts object and the ReadOnlyVariables / ReadWriteVariables lists; they have no declarative equivalent and must be re-implemented. Dynamic SQL (an Execute SQL Task with SQLSourceType = Variable, or a statement built in a Script Task) is not present statically, so the Documenter traces the variable construction to recover what executes. Both are surfaced at the assessment gate, before the build-test-run loop begins, so the effort is accountable up front.
The Surveyor scores the risk before you commit.
Before a single asset moves, the Surveyor inventories your SSIS estate, scores every asset for complexity, and flags the drivers that make a migration risky. You get a prioritized backlog and a clear-eyed view of where the effort really sits, typically the kind of work below.
- Every asset inventoried and complexity-scored
- Risk drivers flagged early, not near the deadline
- A prioritized, data-driven migration backlog
Take SSIS to Fabric or Databricks.
The knowledge base is target-agnostic: document once, then choose the platform that fits your estate and strategy.
Microsoft Fabric
What the fleet builds when you take SSIS to Microsoft Fabric: in dbt or your own framework, iterated until green.
Migrate SSIS to Fabric →Databricks
What the fleet builds when you take SSIS to Databricks: in dbt or your own framework, iterated until green.
Migrate SSIS to Databricks →SSIS migration, answered.
Does the fleet lift-and-shift SSIS packages onto a runtime on Fabric or Databricks?
No. Native SSIS execution on Microsoft Fabric or Databricks is not a GA lift-and-shift, so we do not claim a drop-in runtime. The Documenter reads the logic inside each `.dtsx` package and the agent fleet rebuilds it on the target platform as `dbt` models or in your framework. A Data Flow's row-buffer semantics become set-based SQL or Spark transformations; a Script Task's .NET code is re-implemented; the build-test-run loop iterates until green so the rebuilt logic matches the source.
What happens to Script Tasks and Script Components written in .NET?
Script Tasks and Script Components are opaque custom code with no declarative equivalent, so they are read line by line and re-implemented. A Script Task runs .NET in a `ScriptMain` class with a `Main` entry point and talks to the package through the `Dts` object and its `ReadOnlyVariables` / `ReadWriteVariables` lists; the Script Component is its data-flow analogue. Because the code targets the .NET Framework and is invisible to schema-level mapping, each one is re-expressed in Spark, in your framework, or as a `dbt` macro or Python model. The fleet flags every Script Task in the assessment so the effort is visible before any rebuild begins.
How does the fleet handle dynamic SQL that is built at runtime?
When an Execute SQL Task uses `SQLSourceType = Variable`, or the statement is assembled in a Script Task or property expression, the SQL that actually runs is not present statically in the package. The Documenter traces the variable construction back through the expressions that build the string, so the effective statement is captured rather than guessed. Dynamic SQL and Script Tasks are the two highest-risk constructs in an SSIS estate, and both are surfaced at the assessment gate before the rebuild loop starts.
Can the Documenter read the real connection strings and parameter values?
Yes, by resolving expressions rather than trusting the literal text. A connection manager's `ConnectionString` is frequently driven by an expression or parameter, so the static string in the file is not necessarily what runs. The Documenter resolves property expressions on connection managers and follows the parameter to environment-variable to property binding chain through the SSISDB catalog, since the effective runtime value is often not visible in the `.dtsx` alone.
Does it matter whether the project uses the project or package deployment model?
It does, because the artifacts differ. The project deployment model builds a single self-contained `.ispac` deployed to the SSISDB catalog, with project and package parameters and environment references. The legacy package deployment model saves each `.dtsx` and its `.dtsConfig` configurations individually. The Documenter reads either: an `.ispac` is treated as a self-contained container of the project's packages plus a manifest and parameter definitions, and a loose `.dtsx` is parsed as the XML document it is.
Ready to migrate your SSIS estate?
Tell us about your SQL Server Integration Services landscape and we'll run the assessment, score the risk, and show you the path to Fabric or Databricks.
Plan my migrationA short form, no spam. We usually reply within one business day.