New Features - SQL 2008: Table-Valued Parameters (TVP)



SQL 2008 introduced a nifty feature called Table-Valued Parameters (TVP) into its codebase. TVPs allow developers to pass sets of data to a stored procedure (i.e. passing a table to a stored procedure parameter).

The first thing we need to do, is define a table type, like this:
 
CREATE TYPE [dbo].[MyFriends] AS TABLE(
	[firstname] [varchar](50) NOT NULL,
	[lastname] [varchar](50) NOT NULL
)


Create a little table for our testing purposes:
 
CREATE TABLE [dbo].[friends](
	[friendID] [int] IDENTITY(1,1) NOT NULL,
	[firstname] [varchar](50) NOT NULL,
	[lastname] [varchar](50) NOT NULL,
 CONSTRAINT [PK_friends] PRIMARY KEY CLUSTERED 
(
	[friendID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
	IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
	ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


Next we create a stored procedure using our newly created table type. Note a TVP must be passed as READONLY - which means you can't modify(insert/update/delete rows) it within the body of the routine you're passing it to.
 
CREATE PROCEDURE [dbo].[addFriends]
	@friends MyFriends READONLY
AS
BEGIN
	INSERT INTO friends(firstname, lastname)
	SELECT firstname, lastname 
	FROM @friends
END


In our C# snippet we create a DataTable, add some rows to it, and pass it to our stored procedure:
 
using (SqlConnection connection = new SqlConnection(@"Some connectionString"))
{
    using (SqlCommand command = new SqlCommand("addFriends", connection) { CommandType = CommandType.StoredProcedure })
    {
        DataTable dt = new DataTable();
 
		// Add columns
	dt.Columns.Add("firstname", typeof(String)).MaxLength = 50;
        dt.Columns.Add("lastname", typeof(String)).MaxLength = 50; ;
 
        // Add some rows
	dt.Rows.Add(new Object[] { "Eugene", "Stander" });
        dt.Rows.Add(new Object[] { "Roland", "Cooper" });
        dt.Rows.Add(new Object[] { "Jacques", "Brits" });
 
        connection.Open();		
        command.Parameters.Add("@friends", SqlDbType.Structured).Value = dt;
        command.ExecuteNonQuery();
    }
}
 


How does all of this affect performance though?

A few clues can be found at http://technet.microsoft.com/en-us/library/bb510489.aspx

Summarized in the case of bulk inserts vs TVPs; a formatted data file on the server will perform better using a bulk insert, unless it is a complex operation with less than 1000 rows.

Using a remote client process TVPs will usually perform better, unless its a direct insert with more than 1000 rows.







Post comment

Name *
Email
Title
Body *
Security Code
*
* Required fields

Related Posts

Latest Posts

Be the best stalker you can be


2011-12-13 22:33:54

Syntactic sugar (C#): Enum


2011-08-04 16:50:18

Top 5 posts

Simple WYSIWYG Editor


Creating a WYSIWYG textbox for your website is actually quite simple.
2007-02-01 12:00:00

Moving items between listboxes in ASP.net/PHP example


Move items between two listboxes in ASP.net(C#, VB.NET) and PHP
2008-06-12 17:07:43

Cross Browser Issues: Firefox Word Wrapping


Firefox word wrapping issues
2008-06-09 09:51:21

Populate a TreeView Control C#


Populate a TreeView control in a windows application.
2009-08-27 16:01:03

C# YouTube : Google API


Post on how to integrate with YouTube using the Google Data API
2011-03-12 08:37:51