SPSync vs SSIS for SharePoint Online lists

An SSIS package that loads a SharePoint list into SQL Server every night: why the OData source struggles on SharePoint Online, what the add-ons fix, and what is still yours.

Choose SPSync when an SSIS package exists only to keep SharePoint lists current in SQL Server; choose SSIS when the lists are one input to a larger package, or when you write back to SharePoint.

Documentation reviewed

Where Integration Services fits

Where it breaks

Feature by feature

FeatureSPSyncSQL Server Integration Services (SSIS), with the OData source or a third-party SharePoint component
SharePoint Online supportCore productThrough the OData source (legacy sign-in only) or a third-party SharePoint component
On-prem SharePoint supportOn the roadmapYes: the OData source and the KingswaySoft and CozyRoc components document on-premises SharePoint
DestinationsRelational, warehouse, lake and search/vector destinations: 20 destination engines (30+ named targets such as Azure SQL, MariaDB and Supabase), including SQL Server, Postgres, BigQuery, Databricks, ClickHouse, Parquet, Iceberg, pgvector and Azure AI Search; see /destinations/Any SSIS destination, most often SQL Server
Lookup normalisationLookups become joinable key columns automaticallyDepends on the component; joining lookups to their source lists is built in the package
Multi-value columnsChild tablesNot supported by the OData source; splitting them is up to the package with other components
DeletesSoft delete by default, hard delete with the command-line toolNot detected by a plain read; you compare loads or build delete handling in the package
Delta syncEvery few minutes by default, plus a reconcile, weekly by defaultA filter on Modified with a stored watermark, or a component that documents incremental loading
Schema evolutionNew columns appear automatically; on SQL Server, PostgreSQL, MySQL, ClickHouse, Oracle, SQLite and DuckDB retyped columns get a _v2 columnPackage metadata is refreshed and the package redeployed
Hosted optionSPSync in your AzureThe Azure-SSIS Integration Runtime in Azure Data Factory
Desktop appmacOS and WindowsPackages are built in Visual Studio with the SSIS project extension, on Windows
CLI / CIBuilt-in CLIdtexec, SQL Server Agent and the SSIS catalog
Per-site least-privilege permissionsDelegated sign-in or app-only with Sites.Selected, bring-your-own-appA user name and password on the OData source; an Entra ID app registration on the third-party components
Pricing modelLicensed per installation and per target family, on annual terms, with Standard Support included; no public price list, quoted after a callSSIS comes with a SQL Server licence; each third-party SharePoint component is licensed by its vendor

The package was built years ago, when the list lived on a SharePoint server down the corridor. It reads the Projects list, joins it to the finance tables and writes a reporting table that the month-end pack depends on. Then the site moved to SharePoint Online, the account it signed in with started asking for a second factor, and the job that used to run unnoticed at 2am now fails most nights with a sign-in error. The person who knows the package best spends the morning trying to work out what changed.

Can SSIS still read a SharePoint Online list?

Yes, but rarely with the parts that come in the box. The OData source in SSIS supports SharePoint lists through /_vti_bin/ListData.svc, the REST interface that dates from SharePoint 2010 according to Microsoft’s OData source page. That page also says the source does not support complex types such as multiple-choice items. Microsoft’s OData connection manager page lists the sign-in options and states that modern authentication is not supported and that an option configured for multi-factor authentication cannot be used. When a tenant turns on Entra ID security defaults, Microsoft blocks every sign-in made with an older protocol, so the built-in route stops working at the tenant’s front door.

That is why most SSIS teams reading SharePoint Online use a third-party component. Four come up again and again, and each describes itself fairly on its own pages:

KingswaySoft, CozyRoc and ZappySys each document OAuth sign-in for SharePoint Online, which gets a package past the sign-in problem. The CData page we could read describes SharePoint data and create, read, update and delete support without naming a sign-in method, so check its documentation for your tenant. All four can write to SharePoint through a destination component or write actions, which SPSync never does.

The delta and delete problem in a package

Signing in is the first problem. Keeping a SQL Server table in step with a list is the second, and it is the same whichever component reads the list.

A package that reads the whole list every night is simple and slow, and it gets slower as the list grows past SharePoint’s 5,000-item list view threshold. So the package gets a filter on the Modified column and a watermark table that remembers the last run. That reads less, but a deleted item never matches a filter on Modified. It just stops appearing, and the row in SQL Server stays there, so the month’s totals still count a project that no longer exists.

The usual fixes are a weekly full load compared against the table with a merge or a lookup transform, or a second read of the site’s recycle bin. Both work. Both are logic that lives in the package, and the package also has to handle a column someone adds to the list next Tuesday, which means refreshing the metadata and redeploying.

Scheduling in SQL Server Agent

Here SSIS is hard to beat for a DBA. A SQL Server Agent job step of type SQL Server Integration Services Package runs the package on a schedule, with the alerts, history and operators your other jobs already use. If the SharePoint load is one step in a chain that ends with a cube refresh, that chain is worth keeping.

SPSync does not ask you to give that up. Its command-line tool runs from any scheduler that reads exit codes, so an Agent job step can call it before the package that builds the reporting tables.

When is SSIS still the right answer?

Keep the package when the SharePoint list is one input to a bigger transform, when you write data back into SharePoint, or when the site is still on SharePoint Server on premises, which SPSync does not support today. A team that already owns a SharePoint component and has its delete handling working has little reason to change.

Look at SPSync when the package exists only to keep a copy of the lists current, and the time goes on sign-in failures, missing deletes and column changes. SPSync reads lists through Microsoft Graph with modern sign-in, uses Graph delta queries so each run reads only what changed, including deletions, and keeps a deleted item’s row with its deletion time. Lookups arrive as key columns you can join on and multi-value columns as child tables.

Moving the read out of the package

  1. List what the package reads today: the lists, the columns and how it decides what changed or was deleted.
  2. Connect SPSync to the same site, tick the same lists and choose your SQL Server database as the destination.
  3. Let the first full load finish, then compare the tables with the package’s output, looking hardest at lookup, person and multi-value columns.
  4. Point the package’s source at the SPSync tables instead of SharePoint, and remove the watermark and delete logic it no longer needs.
  5. Schedule SPSync’s command-line tool as an Agent job step ahead of the package, or let the desktop app run on its own interval.

SPSync as an Integration Services alternative for SharePoint lists

SPSync takes the SharePoint read out of the package. It signs in with modern authentication, reads only what changed through Microsoft Graph, keeps a row for every deleted item and adds new columns by itself. Your SSIS packages keep doing the transforms and then read the SPSync tables in SQL Server like any other source.

Other alternatives

Frequently asked questions

Can the SSIS OData source read a SharePoint Online list?

It can point at a list's ListData.svc feed, but Microsoft's OData connection manager page says modern authentication is not supported and an account configured for multi-factor authentication cannot be used (checked 2026-10-23). In a tenant with Entra ID security defaults, which block legacy sign-in, that leaves the built-in source without a supported way in. Most teams on SharePoint Online use a third-party component instead.

How do I find deleted SharePoint items in an SSIS package?

A deleted item is simply missing from the next read. The usual answers are a full load compared with the previous one, or a second source that reads the recycle bin, and both are logic you maintain. SPSync reads changes through Microsoft Graph delta queries, which report deletions, and keeps the deleted item's row with its deletion time in sp_deleted_at.

Can I keep SQL Server Agent as my scheduler with SPSync?

Yes. The SPSync command-line tool runs from any scheduler that reads exit codes, Windows Task Scheduler included, so an Agent job step that runs an operating system command can call it. The desktop app has its own interval if you would sooner not script it.

Do I need SPSync if I already own KingswaySoft or ZappySys?

Not always. If your packages also write back to SharePoint, or the list is one input to a bigger transform, the component you own is doing real work. SPSync fits when the package exists only to keep a copy of the lists current, and the delete handling, lookup joins and column changes are what keep breaking.

Desktop, Azure or command line

All three editions run the same engine, write the same tables and use the same licence key, so the choice comes down to who looks after the sync.

Desktop app

For macOS and Windows. Sign in with Microsoft, tick the lists, choose a database and sync from your own machine on the schedule you set. Delegated sign-in needs no admin unless your tenant requires admin consent for apps.

In your Azure

SPSync in your Azure, a managed application for your own subscription, is deployed with you on a call while the Marketplace listing is prepared. Once deployed it is always on, so the sync keeps running with every laptop closed.

Command line

Every replication is a YAML file you can review and commit. Run it from a server, a container or a CI pipeline, and re-run it safely any time.

Book a call

Book a call to talk through your use case, see further walkthroughs or demos, and set up a trial in your own environment.