Insights/Data Consultancy

Why ETL jobs fail overnight — and how to fix them for good

2026-09-01·5 min read

If your team starts every morning firefighting bad data, the problem isn't bad luck — it's one of a small number of root causes that show up again and again in SQL Server / SSIS environments. Here's what we actually find when we run a Data Health Check.

1. Fragile source connections

The most common failure: a package assumes a source system (a shared drive, an FTP endpoint, an upstream API) will always be available and always return data in the same shape. The moment a file arrives five minutes late, or a column gets renamed upstream, the job dies — and usually with an error message that tells you nothing useful.

Fix: add retry logic with backoff, and validate the shape of incoming data before you try to load it, not after.

2. No idempotency

If a job fails halfway through a load and you rerun it, does it double-count rows, or does it pick up cleanly where it left off? Most legacy SSIS packages we inspect weren't built to be rerun safely — which means a 2am failure often turns into a manual cleanup job at 9am.

Fix: stage data before merging it into production tables, and make every load step safe to run twice.

3. Silent failures

A package that fails loudly is a package you can fix. A package that fails silently — swallowing an error and continuing — is the one that erodes trust in your numbers over months, not days. We regularly find SSIS packages configured to ignore errors on specific components, left over from a one-off debugging session years earlier.

Fix: treat every silent-failure configuration as a bug until proven otherwise, and alert on job status, not just job completion.

4. No real monitoring

"It emails someone if it fails" is not monitoring — it's hoping someone reads their inbox at 6am. We see very few Microsoft-stack environments with actual dashboarding of job health, run duration trends, or row-count anomalies.

Fix: a lightweight job-health dashboard (even a simple Power BI report against your SSISDB catalog) turns "why didn't anyone notice this was broken for three weeks" into "we caught it in the first run."

5. Reports built directly on transactional tables

The slowest, most fragile reports we see are the ones querying live transactional tables directly, often with report-specific logic duplicated across five different Power BI files. Every schema change upstream becomes a five-way debugging exercise.

Fix: a proper semantic layer — even a modest one — means schema changes get fixed in one place, not five.

The pattern

None of these are exotic problems. They're the accumulated result of a data estate that grew organically, under time pressure, without anyone having the mandate to go back and harden it. That's exactly what a Data Health Check is for: a fixed-price, 3–10 day diagnostic that identifies which of these (and other) root causes apply to your environment, with a prioritised roadmap to fix them — starting with whatever's costing you the most sleep right now.

Not sure where to start?

Every service arm begins with a fixed-price diagnostic. Low risk, clear outcome, no open-ended commitment.