Pass Tables to Stored Procedure / Table Valued Parameter

AID: 2130
  • Status: Published

3330 points

  • Byapexpert
  • TypeTips/Tricks
  • Posted on2009-12-21 at 22:01:14
Awards
  • Community Pick
     When we have to pass multiple rows of data to SQL Server, the developers either have to send one row at a time or come up with other workarounds to meet requirements like using XML to pass data, which is complex and tedious to use. There is a SQLBulkCopy object available in .NET to send multiple rows of data to SQL Server at once, but this still cannot be passed to a stored procedure. SQL Server 2008 provides a new feature called "Table-Valued Parameters". This provides us the ability to easily pass a table to a stored procedure from T-SQL code or from an application as a parameter.

Table-Valued Parameters

SQL Server 2008 Provides a New Feature Called Table-Valued Parameters
This provides us to easily pass a table to a stored procedure from T-SQL code or from an application as a parameter.
We first need to create a user defined type

Database Node > Programmability > Types > User-Defined Table Types

 
table1.bmp
  • 317 KB
  • Database Node > Programmability > Types > User-Defined Table Types
Database Node > Programmability > Types > User-Defined Table Types


Script to create a User-Defined Table type
--Create User-defined Table Type
 CREATE TYPE dbo.MessageQueue AS TABLE 
 (
    id int PRIMARY KEY, 
    MessageType varchar(20) NOT NULL,  
    MessageContent varchar(1000) NOT NULL,
    PushDate datetime NOT NULL DEFAULT GETDATE()
 )
 GO
 
 --Using the User-Defined Table Type
 DECLARE @MyMessageQueue MessageQueue
 
 INSERT INTO @MyMessageQueue(id ,MessageType,MessageContent,PushDate)
 VALUES (1,'SMS','Hello World','2009-09-30 10:00:00'),
          (2,'SMS','Hello World','2009-09-30 10:00:00'),
          (3,'MMS','Happy Diwali','2009-10-17 10:00:00')
 
 -- Select the inserted records using new type
 SELECT * FROM @MyMessageQueue 
                                    
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

Select allOpen in new window



Using the Variable as a Parameter
The benefit of User-Defined Table Type is that it can be passed to a stored procedure. Below is an example of using the newly created type with stored procedure using the user defined table type in Stored Procedure
CREATE TABLE [dbo].[MyMessageTable] 
 (
 id [int] PRIMARY KEY,
 MessageType varchar(20) NULL,
 MessageContent varchar(1000) NOT NULL,
 PushDate datetime NULL,
 EngineID int  NOT NULL
 ) 
 GO
 
 CREATE PROCEDURE usp_InsertMessages 
 @MyParameter MessageQueue READONLY,
 @EngineId varchar(20)
  AS
 INSERT INTO MyMessageTable(id,MessageType,MessageContent,PushDate,EngineID)
 
 SELECT id,MessageType,MessageContent,PushDate,@EngineId
 FROM @MyParameter 
 
 --<where condition if any> for the table valued parameter
 
 GO
 
 --Using the User-Defined Table Type in stored procedure
 
 DECLARE @MyMessageQueue MessageQueue
 
 INSERT INTO @MyMessageQueue(id ,MessageType,MessageContent,PushDate)
 VALUES (1,'SMS','Hello World','2009-09-30 10:00:00'),
          (2,'SMS','Hello World','2009-09-30 10:00:00'),
          (3,'MMS','Happy Diwali','2009-10-17 10:00:00')
 
 EXEC usp_InsertMessages @MyMessageQueue,007
 
 -- Select the records inserted using Stored procedure
 SELECT * FROM MyMessageTable 
                                    
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:

Select allOpen in new window



 
table2.bmp
  • 146 KB
  • MyMessageTable
MyMessageTable


In order to use the user defined type user must have execute permission on the type. if user doesn't have execute permission on the same,it can be granted using below statement:
GRANT EXECUTE ON TYPE::dbo.MessageQueue TO <User Name>;
                                    
1:

Select allOpen in new window


Asked On
2009-12-21 at 22:01:14ID2130
Tags

SQL 2008

Topic

SQL Server 2008

Views
2225

Comments

Add your Comment

Please Sign up or Log in to comment on this article.

Join Experts Exchange Today

Gain Access to all our Tech Resources

Get personalized answers

Ask unlimited questions

Access Proven Solutions

Search 3.2 million solutions

Read In-Depth How-To Guides

1000+ articles, demos, & tips

Watch Step by Step Tutorials

Learn direct from top tech pros

And Much More!

Your complete tech resource

See Plans and Pricing

30-day free trial. Register in 60 seconds.

Loading Advertisement...

Top MS SQL Server 2008 Experts

  1. ScottPletcher

    307,720

    Wizard

    6,100 points yesterday

    Profile
    Rank: Genius
  2. jogos

    290,763

    Guru

    1,668 points yesterday

    Profile
    Rank: Sage
  3. acperkins

    225,827

    Guru

    1,000 points yesterday

    Profile
    Rank: Genius
  4. lcohan

    204,801

    Guru

    0 points yesterday

    Profile
    Rank: Genius
  5. TempDBA

    193,106

    Guru

    1,168 points yesterday

    Profile
    Rank: Sage
  6. dtodd

    162,057

    Guru

    0 points yesterday

    Profile
    Rank: Genius
  7. ValentinoV

    145,433

    Master

    0 points yesterday

    Profile
    Rank: Genius
  8. huslayer

    123,080

    Master

    0 points yesterday

    Profile
    Rank: Sage
  9. matthewspatrick

    115,276

    Master

    1,600 points yesterday

    Profile
    Rank: Savant
  10. mwvisa1

    110,108

    Master

    0 points yesterday

    Profile
    Rank: Genius
  11. ralmada

    98,435

    Master

    400 points yesterday

    Profile
    Rank: Genius
  12. anujnb

    96,098

    Master

    0 points yesterday

    Profile
    Rank: Wizard
  13. angelIII

    95,793

    Master

    0 points yesterday

    Profile
    Rank: Elite
  14. EugeneZ

    89,330

    Master

    0 points yesterday

    Profile
    Rank: Genius
  15. HainKurt

    78,387

    Master

    0 points yesterday

    Profile
    Rank: Genius
  16. ryanmccauley

    62,450

    Master

    0 points yesterday

    Profile
    Rank: Sage
  17. MlandaT

    61,188

    Master

    0 points yesterday

    Profile
    Rank: Genius
  18. wdosanjos

    58,235

    Master

    0 points yesterday

    Profile
    Rank: Genius
  19. jimhorn

    56,175

    Master

    500 points yesterday

    Profile
    Rank: Genius
  20. SJCFL-Admin

    53,781

    Master

    0 points yesterday

    Profile
    Rank: Master
  21. sqlservr

    50,989

    Master

    0 points yesterday

    Profile
    Rank: Master
  22. momi_sabag

    50,186

    Master

    668 points yesterday

    Profile
    Rank: Genius
  23. dbaduck

    48,474

    2,000 points yesterday

    Profile
    Rank: Sage
  24. CodeCruiser

    43,768

    0 points yesterday

    Profile
    Rank: Genius
  25. Lowfatspread

    39,114

    0 points yesterday

    Profile
    Rank: Genius

Hall Of Fame