<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://fusionovation.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Matt’s Blog : SQL 2005</title><link>http://fusionovation.com/blogs/mbohn/archive/tags/SQL+2005/default.aspx</link><description>Tags: SQL 2005</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>SQL 2005 &amp; 2008 - Passing complex data sets with the XML type</title><link>http://fusionovation.com/blogs/mbohn/archive/2008/11/13/sql-2005-passing-complex-data-sets-with-the-xml-type.aspx</link><pubDate>Thu, 13 Nov 2008 22:02:00 GMT</pubDate><guid isPermaLink="false">3873cc62-7325-4c9d-b6a6-c9952780d65c:38</guid><dc:creator>mbohn</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://fusionovation.com/blogs/mbohn/rsscomments.aspx?PostID=38</wfw:commentRss><comments>http://fusionovation.com/blogs/mbohn/archive/2008/11/13/sql-2005-passing-complex-data-sets-with-the-xml-type.aspx#comments</comments><description>&lt;p&gt;Sometimes as a web developer you need to pass more complex data as input to a stored procedure.&amp;nbsp;&amp;nbsp; Take for example, a user profile with a question that has multiple check box answers and a database that stores each answer as a seperate row in a table.&lt;/p&gt;
&lt;p&gt;Say our target answer table was created like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;nbsp;CREATE TABLE AnswerTable (&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AnswerID int Primary Key,&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QuestionID int,&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AnswerValue varchar(10)&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We can save multiple answers for a given QuestionID at one time by creating an xml document to represent&amp;nbsp; the answer data and passing it to SQL.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;We could create an XML string like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;string xmlString = &amp;quot;&amp;lt;answers&amp;gt;&amp;lt;answer&amp;gt;a&amp;lt;/answer&amp;gt;&amp;lt;answer&amp;gt;b&amp;lt;/answer&amp;gt;&amp;lt;answer&amp;nbsp;&amp;gt;c&amp;lt;/answer&amp;gt;&amp;lt;/answers&amp;gt;&amp;quot;;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;And a store procedure to receive it like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CREATE&amp;nbsp;PROCECURE&amp;nbsp;[dbo].[sproc_AddAnswers]&lt;/p&gt;
&lt;p&gt;@AnswerXml Xml,&lt;/p&gt;
&lt;p&gt;@QuestionID int&lt;/p&gt;
&lt;p&gt;AS BEGIN&lt;/p&gt;
&lt;p&gt;INSERT INTO AnswerTable SELECT @QuestionID, Item.i.value(&amp;#39;.&amp;#39;, &amp;#39;varchar(30)&amp;#39;) from @AnswerXml.nodes(&amp;#39;answers/answer&amp;#39;) as Item(i)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;END&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;Note how Item.i.value selects the value of the&amp;nbsp;node selected by&amp;nbsp;x-path expression &amp;#39;answers/answer&amp;#39; pass to @AnswerXml.nodes.&amp;nbsp;&amp;nbsp;&amp;nbsp;The nodes() function of the XML type converts XML data to a relational result set.&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;To send the XML to the stored procedure we do something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; //send XML document to SQL server to&amp;nbsp;add answers&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;using (SqlConnection conn = new SqlConnection(connectionString)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SqlCommand myCommand = new SqlCommand(&amp;quot;sproc_AddAnswers&amp;quot;, conn);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCommand.CommandTimeout = 1200;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCommand.CommandType = CommandType.StoredProcedure;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCommand.Parameters.Add(&amp;quot;@AnswerXml&amp;quot;, xmlString);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCommand.Parameters.Add(&amp;quot;@QuestionID&amp;quot;, 1);&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Open();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myCommand.ExecuteNonQuery();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://fusionovation.com/aggbug.aspx?PostID=38" width="1" height="1"&gt;</description><category domain="http://fusionovation.com/blogs/mbohn/archive/tags/SQL+2008/default.aspx">SQL 2008</category><category domain="http://fusionovation.com/blogs/mbohn/archive/tags/XML/default.aspx">XML</category><category domain="http://fusionovation.com/blogs/mbohn/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://fusionovation.com/blogs/mbohn/archive/tags/SQL+2005/default.aspx">SQL 2005</category></item></channel></rss>