Bulk deletion of SPListItems (SPListItemCollection)

2 minute read

A few days ago I had to develop a TimerJob that deletes a large number of items from a SharePoint list. My first idea was to iterate trough the list items and then call the delete method of the items that needed to be deleted.
Doing this was a major performance set back because it took too long to perform this action.

I went searching for another solution and I found one on the blog of The kid.

A SPWeb object has a method called: ProcessBatchData() that processes a specified batch string of commands for sending multiple requests to the server per transaction.

You can build a batch string to delete all of the items from a SharePoint list like this:

 //create new StringBuilder
 StringBuilder batchString= new StringBuilder();

 //add the main text to the stringbuilder
 batchString.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Batch>");

 //add each item to the batch string and give it a command Delete
 foreach (SPListItem item in itemCollection)
 {
    //create a new method section
    batchString.Append("<Method>");
    //insert the listid to know where to delete from
    batchString.Append("<SetList Scope=\"Request\">" + Convert.ToString(item.ParentList.ID) + "</SetList>");
    //the item to delete
    batchString.Append("<SetVar Name=\"ID\">" + Convert.ToString(item.ID) + "</SetVar>");
    //set the action you would like to preform 
    batchString.Append("<SetVar Name=\"Cmd\">Delete</SetVar>");
    //close the method section
    batchString.Append("</Method>");
 }

 //close the batch section
 batchString.Append("</Batch>");

 //preform the batch
 SPContext.Current.Web.ProcessBatchData(batchString.ToString()); 

The only disadvantage that I can think of right know is that all the items you delete will be put in the recycle bin. So if you perform the deletion more than ones you have to be careful with your storage quota.

You can get around that disadvantage by adding the following lines of code. The first section before the batch deletion and the other section after the deletion.

//get the recyclebinenabled status
 bool IsRecycleBinEnabled = SPContext.Current.Web.Site.WebApplication.RecycleBinEnabled;

 if(IsRecycleBinEnabled)
 {
    //set the use off the recyclebin to false
    SPContext.Current.Web.Site.WebApplication.RecycleBinEnabled = false;
 }

 //preform batch deletion

 //set the use off the recyclebin to true