I have a project to break up our large, single site collection/database into multiple separate site collections, with each collection having its own database. I know how to do that natively, but the obstacle is that I'm required to break up existing content and move it to the new locations. For example, I might need to copy/migrate 3072 list items out of 78000.

The only way I know of to do this is duplicate the site via backup and then delete un-needed items. However, space is a concern, so it's not practical to copy the entire site in such a way. I can manually recreate the site, but manually copying hundreds (if not thousands) of list items is not really practical, either. As well, there are linked lookup values that would probably break if the IDs change from source to destination.

Is there a way - either via SharePoint UI, Powershell, or 3rd-party application - to migrate specific list items between different site collections, while keeping all metadata intact?

ADDITIONAL INFO: This is a SharePoint 2013 Enterprise farm. All site collections will be under the same web application. All content databases will be under the same SQL instance, using MS SQL 2012. I'm willing to look into 3rd-party apps like DocAve, but would love to hear from someone who has actually done this sort of project successfully.

I have direct access to the servers and can muddle through writing powershell scripts or even C# code if needed, although I'm by no means a professional developer.

  • Did you try saving the list as a template, then create in a different site collection? Commented Jan 18, 2019 at 18:22

1 Answer 1


You can use this script, which copy items with their metadata:

#Configuration variables
$WebURL = "http://intranet.crescent.com"
$SourceListName = "News"
$TargetListName= "NewsArchive"

#Get Objects
$web = Get-SPWeb $WebURL
$SourceList = $web.Lists[$SourceListName]
$TargetList = $web.Lists[$TargetListName]

#Get all source items
$SourceColumns = $sourceList.Fields
$SourceItems = $SourceList.GetItems();

#Iterate through each item and add to target list
Foreach($SourceItem in $SourceItems)
    $TargetItem = $TargetList.AddItem()
    Foreach($column in $SourceColumns)
        if($column.ReadOnlyField -eq $False -and $column.InternalName -ne "Attachments")
             $TargetItem[$($column.InternalName)] = $sourceItem[$($column.InternalName)];

You can use migration tools for this like Metalogix, ShareGate.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.