Drive SQL Server from events, not SQL Server Agent's clock.

SQL Server Agent runs job steps and SSIS packages on a schedule inside one instance. Kestra decides when a query runs, what feeds it, and what runs next. Trigger on file arrivals or upstream flows, bulk-load between instances in chunks, run multi-statement loads as one transaction, and react to row-level changes in real time.

Blueprints for SQL Server orchestration.

SQL Server Agent covers job scheduling inside the instance. Kestra covers everything around it: it bulk-loads changed rows between instances in chunks, chains a SQL Server extract with Snowflake or object storage in one flow, and reacts to change data capture in real time with no Kafka Connect cluster to operate. A failed batch rolls back as one transaction, and every run posts to Slack or Teams on completion or failure.

Watermark-based incremental sync between SQL Server instancesOpen blueprint
Real-time row changes via the Debezium SQL Server connectorOpen blueprint
Daily SQL Server report exported to CSV and emailedOpen blueprint
Start a flow when SQL Server has new work to processOpen blueprint
Stage, MERGE, and advance a watermark as one transactionOpen blueprint
Browse all 155 SQL Server blueprints

Above the SQL Server Agent job step.

SQL Server Agent runs T-SQL, stored procedures, and SSIS packages on a clock. Kestra runs the steps around the query: what triggers it, how data moves between instances, who gets notified, and where the cross-tool audit trail lives.

Event-driven queries, not Agent cron

SQL Server Agent runs job steps on a schedule and has no concept of an upstream event. Kestra triggers io.kestra.plugin.jdbc.sqlserver.Query the moment a file lands, an API responds, or another flow finishes, and the Trigger task polls SQL Server itself and starts a flow when a query returns rows.

Chunked bulk inserts across instances

Moving rows between SQL Server instances usually means a linked server, an SSIS package, or a hand-rolled loop. io.kestra.plugin.jdbc.sqlserver.Batch reads a stored result set and bulk-inserts it in configurable chunks (1,000 rows by default) using prepared-statement JDBC batches, with retry and resume on transient failures.

Transactional multi-statement loads

A load is rarely one statement: stage, dedupe, MERGE, update a watermark. io.kestra.plugin.jdbc.sqlserver.Queries runs the whole block as one transaction (the default, via transaction: true), so a failure rolls back the batch and a partial load never lands on the target table.

CDC without standing up Kafka Connect

SQL Server's own change data capture writes to system tables, but nothing in SQL Server itself turns that into a downstream action. io.kestra.plugin.debezium.sqlserver.RealtimeTrigger embeds the Debezium engine directly, starting one execution per row change with no Kafka cluster or Kafka Connect deployment required.

Cross-system chains beyond the Microsoft stack

SQL Server Agent only knows the instance it runs on. Kestra chains a SQL Server extract with Snowflake, object storage, Slack, or a REST API in the same flow, so a cross-database migration shows up as one execution instead of three disconnected jobs.

Full audit trail and replay across a fragmented estate

SSIS packages are binary, hard to diff, and their run history lives inside Agent's own tables. Every Kestra execution stores its inputs, outputs, and logs, so a failed nightly load can be inspected, fixed, and replayed from the exact step that failed, without re-running the whole chain.

How teams use SQL Server and Kestra

Patterns data platform teams run in production today. Each one shows the flow end to end, with the real plugin classes in play.

Incremental sync

Move only what changed between two SQL Server instances

A nightly sync used to mean a linked server query or a custom loop. Kestra reads a watermark from the KV Store, pulls changed rows with Query, and bulk-inserts the delta with Batch in 1,000-row chunks. The same pattern feeds a Snowflake warehouse just as easily.

Resumable after failure

The watermark only advances once the destination load commits.

Chunked, not row-by-row

Batch sends 1,000-row JDBC batches per round trip by default.

No external state table

Watermark state lives in Kestra's own KV Store, no schema change needed.

Get icon
read watermark
KV Store
Query icon
extract delta
changed rows
Batch icon
bulk insert
chunked batches
Set icon
advance watermark
on success only
CDC

React to row changes the moment they happen

SQL Server's CDC captures changes into system tables, but nothing acts on them. io.kestra.plugin.debezium.sqlserver.RealtimeTrigger streams row-level changes, one execution per row, with no Kafka or Kafka Connect cluster to run. High-value changes alert Teams; every change is logged for audit.

No Kafka Connect cluster

The Debezium engine runs embedded in the trigger, not as a separate connector deployment.

One execution per row

Each change is independently retried, logged, and replayable.

Selective alerting

An If branches on value so routine changes stay quiet.

RealtimeTrigger icon
CDC stream
row changed
Log icon
log change
audit trail
If icon
check value
threshold?
TeamsIncomingWebhook icon
notify
Teams
Reporting

Replace Agent report jobs and Database Mail

An Agent job step can run a stored procedure, but attaching a CSV to an authenticated email and skipping empty days takes custom T-SQL and Database Mail configuration. Kestra runs the aggregate query, converts the result to CSV with IonToCsv, and emails it only when the day produced rows.

No empty-attachment noise

The email only sends when the query returns rows.

Backfillable on demand

Rerun any past day by passing a date input, no code changes.

Failure never silent

A Slack alert fires separately from the report email itself.

Schedule icon
schedule
06:00 UTC
Query icon
aggregate
daily report
If icon
has data?
skip if empty
MailSend icon
email
CSV attached
Event-driven

Start a flow when SQL Server has new work to process

Some pipelines should react to data, not clocks. The SQL Server Trigger polls a queue-style table on an interval and starts a flow when the query returns rows, then marks them processed with afterSQL so the same rows never fire the trigger twice.

Poll-based data trigger

Fires on rows returned, not on the next cron tick.

afterSQL marks processed

Sentinel rows are flagged so they do not re-trigger.

Fan out per row

A ForEach processes each returned row independently.

Trigger icon
SQL Server trigger
pending rows
ForEach icon
process
per row
SlackIncomingWebhook icon
notify
Slack on done
Transactional load

Stage, dedupe, and MERGE as one atomic load

An incremental load is rarely one statement: stage new rows, dedupe, MERGE into the target, update a watermark. io.kestra.plugin.jdbc.sqlserver.Queries runs the whole block as one transaction by default, so a failed MERGE rolls back everything and the target never holds a half-applied batch.

One transaction, all or nothing

Queries wraps the MERGE and watermark update; a failure rolls back.

Idempotent reruns

The watermark means a rerun resumes from the last committed batch.

Dedup in the MERGE

Late or duplicate rows collapse on the merge key, not downstream.

Query icon
stage load
new rows
Queries icon
merge
upsert + dedup
If icon
row check
validate
SlackIncomingWebhook icon
notify
on complete

Kestra vs the orchestration alternatives SQL Server teams evaluate

Capability
SQL Server Agent
Azure Data Factory
Airflow
Trigger on upstream completion, not just cron
Native event and flow triggers
Job steps on a schedule onlyEvent triggers, Azure-scopedSensors, Python required
Bulk data movement across instances
Batch task, chunked JDBC inserts
Linked server or SSIS packageCopy activity, portal-authoredCustom operator
Transactional multi-statement load
Queries in one transaction
T-SQL stored procedureData Flow, no native transaction wrapOperator chain, no built-in transaction
CDC without Kafka Connect
Debezium SQL Server plugin, embedded
Captures to tables only, nothing acts on itChange Data Capture connector, limitedCustom Debezium consumer required
Chain with non-Microsoft tools
Native plugins, cross-stack
SQL Server / Windows onlyMicrosoft-centric connectorsPossible, Python-heavy
Declarative, version-controlled definitions
YAML in Git
Job steps in msdb, not version-controlledJSON pipelines, portal-authoredPython DAGs
Self-hosted / air-gapped
Self-hosted by default
Tied to the licensed SQL Server instanceCloud-only (Azure)Self-hosted possible

SQL Server & Kestra: common questions

Find answers to your questions right here, and don't hesitate to Contact Us if you couldn't find what you're looking for.

See How

Ready to orchestrate your SQL Server pipelines?

Trigger on upstream events, bulk-load between instances in chunks, run transactional multi-statement loads, and react to CDC in real time. Open source, self-hosted, event-driven.