How do you validate a SQL Server to Microsoft Fabric migration?

Profile every SQL Server table before the move, generate comparison tests from that profile, and run them against the Fabric warehouse or lakehouse through its SQL analytics endpoint. Write down the changes you meant to make, such as datetime to datetime2 and nvarchar to varchar, and sign off when every failing test matches one. A matching row count isn't proof.

Key points

  • Fabric Data Warehouse doesn't store money, datetime, smalldatetime, datetimeoffset, nchar, nvarchar, text, ntext, tinyint, xml, or several other SQL Server types, per Microsoft Learn in November 2026, so most SQL Server to Fabric migrations change column types on purpose.
  • Fabric limits datetime2 and time to six digits of fractional seconds, and strings in a lakehouse's SQL analytics endpoint use the Latin1_General_100_BIN2_UTF8 collation, a binary collation, unlike SQL Server's case-insensitive default.
  • DataOps TestGen's Table Comparison tests profile the source, then check the target column by column for counts, lengths, sums, patterns, and value hashes, without moving data between the two systems.
  • In DataKitchen's October 2026 Jaffle Shop migration, a 55-test health suite passed after 483 orders were left behind; 345 Table Comparison tests failed 61 times, each matching a planned change.
  • TestGen reads Fabric through the SQL analytics endpoint with an Entra ID service principal or managed identity, and reads SQL Server with a SQL login; a migration needs both connections, and open-source TestGen allows one.

Migrating SQL Server to Fabric changes more than the server. It changes types, collations, and sometimes table layout. Validation has to tell those planned changes apart from the ones nobody meant to make.

This page covers the Fabric specifics. The general migration method explains the five pieces any migration needs, whatever the tool.

What Fabric changes on purpose

From Microsoft Learn’s Fabric data types, checked November 3, 2026:

SQL Server typeFabric Warehouse alternativeWhat a comparison test may see
datetime, smalldatetimedatetime2 (up to 6 fractional digits)Shifted minimum or maximum dates if precision changes
datetimeoffsetdatetime2The offset isn’t stored, so decide how you convert
money, smallmoneydecimalSums match if scale is kept
nchar, nvarcharchar, varchar (UTF-8 collation)Text should match; storage size can differ
text, ntextvarcharValues over 16 MB don’t fit varchar(max)
tinyintsmallintNo value change
xmlNo equivalentColumn needs a new home

Collation changes too. Strings in a lakehouse’s SQL analytics endpoint use Latin1_General_100_BIN2_UTF8, a binary collation, while SQL Server’s default is case-insensitive. TestGen’s migration docs note that a case-insensitive source counts ACME and acme as one distinct value, so Match Distinct Count can fail on a correct copy.

Write each of these into your expected-differences list before cutover.

The steps with TestGen

The workflow is TestGen’s Verify a Data Migration procedure:

  1. Connect TestGen to SQL Server with a read-only SQL login. In the source table group, turn on Profile for table comparison and turn off profile sampling.
  2. Run data profiling on the source, then generate a test suite with only the Table Comparison generation set.
  3. Connect TestGen to Fabric through the SQL analytics endpoint, with an Entra ID service principal or managed identity. Create a destination test suite and exclude it from quality scoring.
  4. Write a mapping CSV of renamed tables and columns. Use DROP for columns you retired.
  5. Run transfer_tests.py without --apply, read the report, then run it with --apply.
  6. Run the destination suite. Match each failure to your list.

Run it after every mock load, not only at cutover. In DataKitchen’s Jaffle Shop migration, 345 tests ran in five seconds.

What it catches and what it doesn’t

Table Comparison checks counts, null counts, lengths, sums, date ranges, frequent values and patterns, and value hashes, column by column. In DataKitchen’s testing on three public datasets it caught 774 of 785 planted changes. It’s not a row-by-row diff: a failure tells you which column changed, and you query both sides by key to find the rows. Text-hash tests need UTF-8 collations on the SQL Server side, which means SQL Server 2019 or later.

Licensing

A migration needs two connections, SQL Server and Fabric, at the same time. Open-source TestGen allows one, so plan on Enterprise at $100 per user and $100 per connection per month for the length of the project. Start at the Microsoft Fabric install page, and read How does TestGen verify a cloud data migration for the full feature walkthrough.

Frequently asked questions

Short answers to the follow-up questions people ask next.

Why do correct rows fail comparison tests after a move to Fabric?

Because Fabric stores some SQL Server types differently. Fabric Data Warehouse has no datetime, money, or nvarchar; Microsoft suggests datetime2, decimal, and varchar. datetime2 keeps six fractional digits, and lakehouse strings use a binary UTF-8 collation. Those planned changes can shift dates, distinct counts, and lengths, so list them before cutover and expect those tests to fail.

Is a row count check enough for a Fabric migration?

No. A row count proves rows arrived. It doesn't catch a truncated string, a shifted date, or swapped values. In DataKitchen's October 2026 Jaffle Shop example, a 55-test health suite passed after 483 orders were left behind. Column-level comparison tests built from the source profile found the problem.

Does TestGen copy data between SQL Server and Fabric?

No. TestGen profiles SQL Server where it lives, runs generated queries against Fabric where it lives, and compares the results. Only computed results, such as counts, sums, and hashes, go into TestGen's own database. That's also why a failure names the column that changed, not the row.

Can I test a lakehouse and a warehouse the same way?

Yes. TestGen's OneLake connection reads through the Fabric SQL analytics endpoint, which serves both lakehouse and warehouse tables as T-SQL. Point the connection at the item you migrated to. The endpoint is read-only for lakehouse table data, and TestGen only runs SELECT statements anyway.

Try it on your own data

DataOps TestGen is free and open source. Profile a table and generate its tests this afternoon.