DEV Community

Cover image for Passing an Array of Items to a SQL Stored Procedure Using XML from C#
Sean Drew
Sean Drew

Posted on • Edited on

Passing an Array of Items to a SQL Stored Procedure Using XML from C#

In SQL Server, a common challenge is passing multiple values to a stored procedure. One effective way to achieve this is by passing an array or list of items as a parameter allowing you to compactly represent an array of items as a single parameter, making it easy to process complex datasets without numerous calls to the database.

Step 1: Define the SQL Stored Procedure
Create a stored procedure that accepts an XML parameter and use the nodes method to traverse the XML and extract items into a table variable for further processing.

use [YourDatabase]
go

drop procedure if exists [dbo].[ProcessItemsFromXML]
go

create procedure [dbo].[ProcessItemsFromXML]
  @Items XML
as
begin
    -- declare a table variable to store the XML parsed items
    declare @itemtable table (Item nvarchar(50));

    -- parse the XML and insert items into the @itemtable table variable
    insert into @itemtable (Item)
    select x.value('.', 'nvarchar(50)')
    from @Items.nodes('/Items/Item') as t(x);

    -- select the items
    select * from [dbo].[YourTable] where [YourColumn] in (select [Item] from @itemtable);
end
go
Enter fullscreen mode Exit fullscreen mode

Step 2: Create the C# method to pass XML to the Stored Procedure
Write a C# method that constructs the XML from an array of items and calls the stored procedure using "XElement" from the "System.Xml.Linq" namespace to create the XML structure.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Xml.Linq;

public class DataProcessor
{
  public void ExecuteStoredProcedureWithXML(SqlConnection connection, string[] items)
    {
      // create test XML structure
      var xmlItems = new XElement("Items", 
          items.Select(item => new XElement("Item", item)));

      using (SqlCommand command = new SqlCommand("ProcessItemsFromXML", connection))
      {
        command.CommandType = CommandType.StoredProcedure;

        // add the XML parameter
        SqlParameter xmlParam = command.Parameters.AddWithValue("@Items", xmlItems.ToString());
        xmlParam.SqlDbType = SqlDbType.Xml;

        // execute the command
        connection.Open();
        command.ExecuteNonQuery();
        connection.Close();
      }
  }
}

Enter fullscreen mode Exit fullscreen mode

Step 3: Example of using the "ExecuteStoredProcedureWithXML" method.
This sample code initializes an array of items, creates a SQL data client connection, and calls the method to pass the array as XML to the SQL stored procedure.

class Program
{
  static void Main()
  {
    string[] items = { "Item1", "Item2", "Item3" };

    using (SqlConnection connection = new SqlConnection("sql conn string"))
    {
      DataProcessor processor = new DataProcessor();
      processor.ExecuteStoredProcedureWithXML(connection, items);
    }
  }
}

Enter fullscreen mode Exit fullscreen mode

Explanation of the code
XML Creation: Create an "XElement" named "xmlItems" which wraps the individual items inside tags. This structure matches what the "ProcessItemsFromXML" SQL stored procedure expects.

SQL Command: Instantiate a SQLDataClient "SqlCommand" object and specify the "ProcessItemsFromXML" stored procedure and set its type to "CommandType.StoredProcedure."

Parameter Passing: The XML string is added as a parameter using "AddWithValue" specifying the "SqlDbType.Xml" type because the stored procedure expects XML data as a parameter.

Execution: The command is executed, opening and closing the connection as needed.

Conclusion
Using XML to pass arrays to SQL stored procedures from C# is an effective and flexible approach that allows you to encapsulate multiple values into a single parameter, reducing the overhead of multiple database calls and is useful for batch processing.

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

Billboard image

Try REST API Generation for MS SQL Server.

DevOps for Private APIs. With DreamFactory API Generation, you get:

  • Auto-generated live APIs mapped from database schema
  • Interactive Swagger API documentation
  • Scripting engine to customize your API
  • Built-in role-based access control

Learn more