One may want to pass an array of data to SQL Server. The most recent reason for me was so I could look for a specific record based on multiple criteria.
There are several ways to pass XML to SQL Server. One of the simplest ways to pass the data is as a string. However other options are available such as creating an SqlXML object from a list using the following C# function from
/**
* Get an SqlXml representation of the list
*
* @param IEnumerable list: The list to convert
* @return SqlXml
**/
public static SqlXml GetSqlXml(IEnumerable list)
{
//We don't use 'using' or dispose or close the stream,
//since it lives in the return variable
MemoryStream stream = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(stream))
{
writer.WriteStartElement("list");
foreach (object obj in list)
{
writer.WriteElementString("item", obj.ToString());
}
writer.WriteEndElement();
stream.Position = 0;
return new SqlXml(stream);
}
}
From: http://www.codeproject.com/Articles/20847/Passing-Arrays-in-SQL-Parameters-using-XML-Data-Ty
Another way to create the XML representation, in VB.net, is to use the following:
Dim xmlDoc As New System.Xml.XmlDocument
Dim table As System.Xml.XmlElement = xmlDoc.CreateElement("table")
For Each child As String In New String() {"s1", "s2", "s3"}
Dim id As System.Xml.XmlElement = xmlDoc.CreateElement("id")
id.innerText = child
table.AppendChild(id)
Next
xmlDoc.AppendChild(table)
Then pass the xmlDoc as a string. Once you have the parameter set up, you can define a stored procedure to accept an XML parameter such as the following:
CREATE PROCEDURE [dbo].[StoredProcedure1] ( @Criteria XML = NULL )
AS
BEGIN
...
END
The last important piece is to parse the XML in SQL Server. If you have the following XML:
<table>
<id>1</id>
<id>2</id>
<id>3</id>
</table>
You can access the “id” nodes by using the following:
SELECT r.id.value('.', 'varchar(50)') AS ID
FROM @Criteria.nodes('/table/id') AS r(id)
