Standard Operating Procedure

SQL Server → Azure Synapse Analytics (Dedicated SQL Pool)

Step-by-step procedure for migrating a SQL Server database into an Azure Synapse Analytics dedicated SQL pool using Endrias Bridge. Worked example: the eb_healthcare database (patients, appointments, providers, diagnoses, prescriptions, lab_results, insurance_claims).

Tool: Endrias Bridge  ·  Source: SQL Server 2016+ on-prem, VM, or Azure SQL  ·  Target: Azure Synapse Analytics — Dedicated SQL Pool

📖 Overview & Scope

Azure Synapse Analytics (SQL Pool) is registered in Endrias Bridge as a full member of the SQL Server family of engines — the same internal engine group as SQL Server, Azure SQL Database, Azure SQL Managed Instance, and AWS RDS for SQL Server. That grouping matters: it means Synapse is not a bolt-on, target-only connector (unlike, for example, Databricks). It gets the same mssql+pyodbc ODBC connection path, the same Encrypt=yes;TrustServerCertificate=no secure-by-default handling as Azure SQL Database, the full generic relational schema-and-data migration engine, and the full live DMF compatibility scan when Synapse is used as a source. No special or dedicated migration code was required to add Synapse support — it works through the exact same code path as any other SQL Server-family engine.

ℹ️
Bidirectional support: Because Synapse is grouped with the SQL Server family, Endrias Bridge supports Synapse → SQL Server as well as SQL Server → Synapse. Use the same steps with source and target swapped — useful for pulling a curated warehouse subset back into an operational database, or for DR/test refresh scenarios.
⚠️
This SOP targets a dedicated SQL pool. If your Synapse workspace only has a serverless SQL pool, read the Dedicated vs Serverless comparison below before you begin — this tool's INSERT-based approach is not a good fit for a serverless pool as a migration target.
ℹ️
Estimated time: ~10–15 minutes for setup and assessment, plus the data copy duration. eb_healthcare.lab_results (1,500,000 rows) is the largest table in this walkthrough and is a reasonable proxy for how long the full copy phase will take on your own dataset.

Prerequisites — Source (SQL Server)

RequirementNotes
SQL login with db_datareader + VIEW SERVER STATEMinimum
db_owner recommended if you plan to try incremental/CDC syncRecommended
ODBC Driver 17 for SQL Server installed on migration hostRequired
TCP 1433 open from migration host to source serverRequired
SQL Server version 2016+ (Compatibility level 130+)Required
-- Verify source SQL Server version and compatibility level
SELECT @@VERSION;
SELECT name, compatibility_level
FROM sys.databases
WHERE name = 'eb_healthcare';

-- Grant minimum permissions on source
USE eb_healthcare;
CREATE USER MigrationUser FOR LOGIN MigrationUser;
ALTER ROLE db_datareader ADD MEMBER MigrationUser;
GRANT VIEW SERVER STATE TO MigrationUser;

Prerequisites — Target (Azure Synapse Analytics)

Endrias Bridge does not provision the Synapse workspace or SQL pool — both must already exist and be reachable before Step 1. Complete the following in the Azure Portal before connecting:

1. Provision a dedicated SQL pool:

In your Synapse workspace, create (or confirm) a Dedicated SQL Pool (formerly SQL DW), sized to a DWU tier appropriate for your data volume. Do not point this migration at a serverless pool as the target — see the Dedicated vs Serverless table.

2. Add migration host firewall rule:

Navigate to Azure Portal → your Synapse workspace → Networking → Firewall rules. Add the public IP of your migration host as an allowed inbound rule, or enable Allow Azure services and resources to access this workspace if the migration host runs inside Azure. If the workspace is on a private endpoint/VNet instead, the migration host must be able to reach that endpoint (VPN/peering) before Step 1 will succeed.

3. Create a SQL login and contained database user on the target:

-- Run on the dedicated SQL pool (e.g. eb_healthcare_dw) via SSMS,
-- Azure Data Studio, or the Synapse Studio SQL script tool
CREATE USER MigrationUser WITH PASSWORD = 'your-password';
EXEC sp_addrolemember 'db_owner', 'MigrationUser';
🚫
SQL authentication only. Endrias Bridge connects via mssql+pyodbc using a UID/PWD connection string — there is no Azure AD / OAuth login flow in this release. The account you create above must be a SQL login in the Synapse workspace, not an Azure AD-only identity.

4. Confirm the pool is online:

Pool StateMigration Impact
OnlineReady — proceed to Step 1
PausedResume the pool in Synapse Studio or Azure Portal first; connections will time out while paused
ScalingWait for scaling to complete before starting a large data copy
⚠️
Like Azure SQL Database, Synapse can drop idle pooled connections. Endrias Bridge detects TCP 10054 / forcibly closed errors and automatically retries once after disposing the connection pool — no manual intervention is normally needed for a transient drop of this kind.
1

Configure Connections

Open Endrias Bridge and navigate to Step 5 — DB Migration. Fill in both connection blocks as shown below. Connection setup for Synapse is exactly like Azure SQL Database — no field repurposing is needed. The only decision point is which SQL endpoint hostname to use.

Pool TypeHostname Pattern
Dedicated SQL Pool (use this as migration target)<workspace-name>.sql.azuresynapse.net
Serverless SQL Pool (read-only source use only)<workspace-name>-ondemand.sql.azuresynapse.net
  Endrias Bridge — Step 5: Source & Target Configuration

SOURCE DATABASE

SQL Server
sql-source-server
(blank)
eb_healthcare
MigrationUser
••••••••••••

TARGET DATABASE

Azure Synapse Analytics
eb-synapse-ws.sql.azuresynapse.net
1433
eb_healthcare_dw
MigrationUser
••••••••••••
Test Connections
Save Configuration
💡
Click Test Connections first. Failures at this stage are almost always firewall-related (missing workspace firewall rule) or pool-state related (dedicated pool still Paused) — confirm both before troubleshooting credentials.
⚠️
Double-check you entered the dedicated pool hostname (no -ondemand suffix) and the dedicated pool's database name. Pointing the target at the -ondemand serverless endpoint will pass the connection test (serverless accepts read connections fine) but will fail once schema/data migration attempts CREATE TABLE and INSERT in Step 4 — see Dedicated vs Serverless.
2

Run Assessment / DMF Scan

Switch to the Assessment tab and click Run Assessment to discover source objects and check target compatibility. Then run the DMF (Data Manufacturing Factory) compatibility scan — available from the Run DMF Scan button in the app header, or the DMF card on the Tools tab.

ℹ️
Because SQL Server and Synapse are both members of the SQL Server family, DMF runs its full live check set against your SQL Server source before this migration — the same depth of scan you'd get migrating to Azure SQL Database. This is not the reduced check set you'd see targeting a NoSQL store or a non-SQL-Server-family warehouse. DMF checks: compatibility level, deprecated data types (TEXT/NTEXT/IMAGE), deprecated feature usage counters, linked servers, CLR assemblies, and Service Broker status — plus target-specific compatibility notes for Synapse.
  Endrias Bridge
Assessment
Migration
Jobs
Schema Objects
Tools
Database Assessment
Discovers source database objects and checks compatibility with target.
Run Assessment
Run DMF Scan

SOURCE OBJECTS

📁 Tables (7)
  patients   210,400 rows
  providers   3,120 rows
  appointments   980,600 rows
  diagnoses   642,300 rows
  prescriptions   715,900 rows
  lab_results   1,500,000 rows
  insurance_claims   528,750 rows

DMF SCAN RESULTS

• Compatibility level: 150 → OK
• Deprecated types: 0 found (TEXT/NTEXT/IMAGE)
• Deprecated feature counters: 0 hits
• Linked servers: none detected
• CLR assemblies: none detected
• Service Broker: disabled
• Target note: Synapse — no PK/FK/UNIQUE enforcement at write time
ℹ️
If DMF is ever run with Synapse itself as the source (for example, comparing a Synapse-to-Synapse or Synapse-to-SQL-Server setup), a couple of checks designed around SQL Server on-prem/Azure SQL — notably the deprecated-features performance counter query — may not be fully applicable to a dedicated pool. Those checks are wrapped in error handling and surface as a warning rather than crashing the scan, but they were built with SQL Server/Azure SQL sources primarily in mind.
3

Select Tables

Switch to the Migration tab. Click Load Tables from Source to populate the table list from eb_healthcare. All seven healthcare tables are safe to include in a standard migration.

  Endrias Bridge
Assessment
Migration
Jobs
Schema Objects
Tools
Migrate Schema & Data
Select tables and copy schema / data to target dedicated SQL pool.
Migrate schema (CREATE TABLE)
Migrate data (INSERT rows)
Sync mode:
Full copy
Incremental (watermark column)
SQL Server CDC
Load Tables from Source
Start Migration
Verify Data Integrity
Export Report
patients
providers
appointments
diagnoses
prescriptions
lab_results
insurance_claims
⚠️
Use Full Copy for your first Synapse migration. Incremental (watermark) and SQL Server CDC sync modes are technically available here because Synapse is grouped with the SQL Server family, but they have not been specifically validated against Synapse's DML restrictions in this release. Treat those two modes as available-but-not-yet-proven for a dedicated SQL pool target — Full Copy is the well-tested, recommended mode.
4

Start Migration & Monitor

Click Start Migration with Full Copy selected. Watch the Migration Log update live as each table's schema is created and its rows are copied into the dedicated SQL pool.

  Endrias Bridge — Migration Log
09:14:02 --- Data type conversions (SQL Server -> Azure Synapse) ---
09:14:02 Same engine family — standard T-SQL types map 1:1
09:14:02 CREATE TABLE issued via mssql dialect (default distribution: ROUND_ROBIN)
09:14:03 Schema: created 7 table(s) on eb_healthcare_dw
09:14:04 [1/7] providers ... 3,120 row(s)
09:14:06 [2/7] patients ... 210,400 row(s)
09:14:19 [3/7] appointments ... 980,600 row(s)
09:14:41 [4/7] diagnoses ... 642,300 row(s)
09:14:58 [5/7] prescriptions ... 715,900 row(s)
09:15:47 [6/7] lab_results ... 1,500,000 row(s)
09:16:12 [7/7] insurance_claims ... 528,750 row(s)
09:16:12 --- Full copy: 4,581,070 row(s) in 2m 10s ---
09:16:12 NOTE: PRIMARY KEY / FOREIGN KEY constraints on target are metadata-only — not enforced by dedicated SQL pool
09:16:12 --- Done ---
ℹ️
The schema step issues standard CREATE TABLE DDL translated by SQLAlchemy's mssql dialect — the same statement generator used for SQL Server and Azure SQL Database targets. Synapse accepts it, but it does not carry any Synapse-specific distribution clause, so every table lands on the pool's default distribution strategy (effectively ROUND_ROBIN). See Step 6 for tuning this after migration.
⚠️
If you see a TCP 10054 or forcibly closed error mid-migration, Endrias Bridge automatically retries once after disposing the connection pool. If the dedicated pool was paused or mid-scale when you started, connections will fail outright rather than just drop — confirm pool state in Synapse Studio if retries don't clear the error.
5

Run Data Quality Check

Switch to the Tools tab and run Data Quality Checks against the source tables already loaded on the Assessment tab. For a Synapse migration this step matters more than it does for a same-engine SQL Server → SQL Server or SQL Server → Azure SQL Database move.

🚫
Why this matters specifically for Synapse: a dedicated SQL pool lets you declare PRIMARY KEY / FOREIGN KEY / UNIQUE constraints, but it does not enforce them at write time — they exist only as metadata hints for the query optimizer. On SQL Server, those constraints have been silently preventing certain bad states (duplicate keys, orphaned foreign-key rows) the whole time your source database has been live. Once data lands on Synapse, that safety net is gone: if the source ever had integrity problems that the SQL Server constraints happened to catch going forward, or if anything writes to Synapse directly post-migration without app-level validation, duplicate keys and orphaned rows can appear on Synapse in ways that were never possible on the source.
  Endrias Bridge
Assessment
Migration
Jobs
Schema Objects
Tools
Data Quality Checks
Scans source tables loaded on the Assessment tab for duplicate primary keys, NULL-heavy columns, and orphaned foreign keys.
Run Data Quality Checks

RESULTS — eb_healthcare

• patients: 0 duplicate PKs, 0 NULL-heavy columns
• appointments.provider_id → providers.provider_id: 0 orphaned rows
• prescriptions.patient_id → patients.patient_id: 0 orphaned rows
• lab_results.appointment_id → appointments.appointment_id: 142 orphaned row(s)
• insurance_claims.notes: 61% NULL → flagged NULL-heavy
• diagnoses: 0 duplicate PKs, 0 orphaned rows
💡
Treat Data Quality Checks as a standard pre-migration step for any Synapse target, not an optional extra. The 142 orphaned lab_results rows in the example above were harmless on SQL Server because they simply couldn't accumulate further under FK enforcement — on Synapse they will sit in the table indefinitely with no engine-level mechanism to prevent more from appearing. Decide before migration whether to clean, quarantine, or knowingly accept flagged rows.
6

Post-Migration

Dedicated SQL pools have a different performance and operations model than SQL Server. Review the following items after migration completes.

1. Tune distribution strategy for large tables:

Endrias Bridge does not choose a distribution strategy for you — it issues generic CREATE TABLE DDL, which lands on Synapse's default (ROUND_ROBIN). For large fact-style tables such as lab_results (1,500,000 rows) or insurance_claims, ROUND_ROBIN is rarely optimal once you start joining against dimension tables like patients or providers at scale. Consider manually switching these tables to HASH distribution on a common join key:

-- Manual post-migration tuning step — not automated by Endrias Bridge
CREATE TABLE dbo.lab_results_hashed
WITH (
    DISTRIBUTION = HASH(patient_id),
    CLUSTERED COLUMNSTORE INDEX
)
AS SELECT * FROM dbo.lab_results;

-- Swap the tables once verified
RENAME OBJECT dbo.lab_results TO lab_results_roundrobin;
RENAME OBJECT dbo.lab_results_hashed TO lab_results;

-- Repeat the same pattern for insurance_claims, e.g. HASH(patient_id)

This is a manual T-SQL exercise performed on the target after migration — Endrias Bridge does not automate distribution key selection or execute CTAS swaps for you.

2. Decide whether to re-add constraints as unenforced metadata:

If your BI/reporting tools rely on declared PK/FK relationships for join elimination or semantic modeling, you can add them back as metadata-only constraints (they will not be enforced at write time, per Synapse's design):

ALTER TABLE dbo.patients
  ADD CONSTRAINT PK_patients PRIMARY KEY NONCLUSTERED (patient_id) NOT ENFORCED;

ALTER TABLE dbo.appointments
  ADD CONSTRAINT FK_appointments_patients
  FOREIGN KEY (patient_id) REFERENCES dbo.patients (patient_id) NOT ENFORCED;

3. Recreate SQL Agent jobs as Synapse pipelines/triggers:

Synapse has no SQL Server Agent. Export job definitions from the source using the Schema Objects tab, then recreate the equivalent scheduled logic as Synapse pipelines with scheduled or tumbling-window triggers in Synapse Studio. Endrias Bridge does not create pipelines or triggers for you — this is a manual rebuild step in Synapse Studio.

⚠️
Re-run Data Quality Checks periodically after go-live if anything other than this migration tool writes to the Synapse tables — without SQL Server's constraint enforcement, integrity drift can accumulate silently over time.

⚖️ Dedicated vs Serverless SQL Pool — Comparison

AspectDedicated SQL PoolServerless SQL Pool
Hostname<workspace>.sql.azuresynapse.net<workspace>-ondemand.sql.azuresynapse.net
CREATE TABLE + row-by-row/batch INSERTSupported — works like SQL ServerNot a good fit — primarily a read-only query layer over data lake files
Use as Endrias Bridge targetRecommendedNot recommended
Use as Endrias Bridge sourceSupportedFine for reading via external tables/views
Billing modelProvisioned DWU capacity (always-on cost, or pause when idle)Pay-per-query, no capacity to provision
Distribution strategy tuning (Step 6)Applicable — HASH/ROUND_ROBIN/REPLICATENot applicable — no managed table storage
Constraint enforcementMetadata-only, not enforced (see Step 5)N/A — queries external files, no native tables
💡
If your workspace currently only has a serverless pool and you need a write target for this migration, provision a dedicated SQL pool first. Serverless remains useful afterward for ad hoc querying of files in the lake — it just isn't where this tool should write to.

🗺️ Known Issues / Caveats

Constraint enforcement gap: Dedicated SQL pools accept PRIMARY KEY / FOREIGN KEY / UNIQUE declarations but do not enforce them at write time. Run Data Quality Checks before migrating and periodically after go-live if other processes write to the target.

Serverless pool as a target: This tool's INSERT-based approach does not work well against a serverless SQL pool. Use a dedicated SQL pool as the migration target; serverless is fine as a source or for post-migration ad hoc querying.

Distribution strategy not automated: Tables are created via generic CREATE TABLE DDL and land on the pool's default (effectively ROUND_ROBIN). Manually tune large fact tables to HASH distribution post-migration (Step 6).

Incremental / CDC sync not fully validated for Synapse: These modes are selectable because Synapse is grouped with the SQL Server family, but they have not been specifically validated against Synapse's DML restrictions in this release. Use Full Copy for a first migration.

SQL Server Agent jobs: Synapse has no SQL Agent. Recreate scheduled logic as Synapse pipelines with triggers — this is a manual rebuild in Synapse Studio, not automated by Endrias Bridge.

DMF checks on a Synapse source: A couple of DMF checks (notably the deprecated-features performance counter query) were designed with SQL Server on-prem/Azure SQL sources in mind and may not fully apply if Synapse itself is ever used as the DMF scan source — they degrade to a warning rather than a crash.

SQL authentication only: No Azure AD/OAuth login flow — a SQL login must be created in the Synapse workspace for the migration credentials.

IssueImpactResolution
Constraint enforcement gapDuplicate keys / orphaned FK rows possible post-migrationRun Data Quality Checks pre- and post-migration
Serverless pool as targetCREATE TABLE / INSERT not well supportedUse a dedicated SQL pool as the migration target
Distribution strategyAll tables default to ROUND_ROBINManually HASH-distribute large fact tables (Step 6)
Incremental / CDC syncAvailable but not specifically validated for SynapseUse Full Copy for first migration; treat others as experimental
SQL Agent jobsNo SQL Agent on SynapseRecreate as Synapse pipelines + triggers
DMF on Synapse-as-sourceSome checks not fully applicableDegrades to warning, not a crash — informational
SQL auth onlyNo Azure AD/OAuth loginCreate a SQL login in the Synapse workspace