Migration and cut-over
Moving SharePoint list data into a database for good and switching the applications and reports that depend on it over safely.
A team has decided that a SharePoint list should become a database table, usually because an app has outgrown it. The first copy is rarely what goes wrong. The risk sits on the day you switch, when every report and app that reads the list has to point somewhere new without losing an edit someone made that morning.
Replication makes that day smaller. SPSync copies the lists into the target database and keeps copying on a schedule while people carry on editing in SharePoint, so the database is never more than one sync cycle behind. Lookup and person columns arrive as join keys and multi-value columns as child tables, which means whatever you move across finds the data in a relational shape from the start. Each report or app can then move on its own timetable.
Before each switch, check the copy against the list. Compare row counts, sample a few items by sp_item_id, and run spsync reconcile, which compares both sides in full and gives the people who own the data a check they can sign off. When the last consumer has moved, freeze edits on the list, let a final delta run and stop the replication. The list can stay in SharePoint, read-only, as the archive.
Know the limits before you plan. SPSync copies current field values; SharePoint's version history is not replicated, though a deleted item keeps its row with sp_deleted_at set. It reads SharePoint Online only, so an on-premises farm needs another route for now. SPSync never writes to SharePoint either. During the move the new app writes to its own tables, and the list stays the place people edit until the cut.
Moves between tenants follow the same pattern. After a merger, replicate each tenant through its own connection into one database with a table prefix per site, and a copy taken before the migration stays as a record of what each list held, whatever the migration tool does to the source.
Start here
- SharePoint list cutover to a database without losing rows
The cut-over sequence comes first, because every other step in a migration hangs off it.
- Merging two SharePoint tenants' lists into one database
Two tenants add connections, prefixes and a merged view on top of that sequence.
- Script a SharePoint list migration into a database
Scripting belongs at the end, once you know which steps you want to repeat in staging and production.
All posts on this topic
- Archive old SharePoint list items without losing the history
Moving closed items to an archive list just builds a second big list. Keep every row in SQL, then let a scheduled flow trim the live list safely.
- SharePoint list cutover to a database without losing rows
Replicate the list, check counts and a sample by item id, freeze edits, run a final delta and a reconcile, then switch the app and keep SharePoint read-only.
- Merging two SharePoint tenants' lists into one database
After an acquisition, replicate both tenants' SharePoint lists into one database with a connection and a table prefix per tenant, then report from one view.
- Script a SharePoint list migration into a database
Move SharePoint list data into a database with a CLI, a YAML config and batch definitions, so every run ends with the commands that reproduce it in the next environment.
Other topics on the blog
Frequently asked questions
Is this a one-off export or an ongoing sync?
Both, in sequence. The first run against a list is a full load and every later run is a delta sync. Keep it running during the migration so the database never falls behind the list people are still editing, then stop it after cutover.
Does the migration keep the list's item history?
SPSync copies current field values; SharePoint's version history is not replicated. It does keep every deleted item, with sp_deleted_at set, so the target database records what existed even after someone removes it from the list.
Can we migrate several related lists at once, with lookups intact?
Yes. Lookup columns become key columns, so a set of related lists arrives with the relationships they had in SharePoint, ready for an application to query. Multi-value lookups are still being verified on a live tenant.