SQL Server allows you to pass complex types to Stored Procedures and User Functions as parameters. In the past, this was overcome by using CSV strings and splitting them. Now, with complex types (think, tables) we can pass whatever we need and return whatever we need back. There’s a limitation that as of 2008 you can only pass READONLY variables, but this is easily overcome by re-inserting into memory tables if the need to edit is there. Here’s the syntax to do it – just paste into SQL Management Studio to see:     
      
Here’s the raw code: http://codepaste.net/tieqkw      
  
SET NOCOUNT ON       
/*         
    by: jerry        
    on: 9/2011        
    to: demo table types        
*/         
          
-- Create the data type         
CREATE TYPE MyTableType AS TABLE         
(         
    Key1 int,        
    Key2 int        
)         
GO         
          
-- Create the proc receiving param         
CREATE PROC up_MySlaveProc         
    @table MyTableType READONLY        
AS         
    PRINT 'HELLO FROM SLAVE'        
    select * from @table        
GO         
          
-- Create the proc sending param         
CREATE PROC up_MyMasterProc         
    /* no parameters */        
AS         
    PRINT 'HELLO FROM MASTER'        
    declare @table MyTableType        
    insert into @table values        
         (1, 2)          
        ,(2, 2)           
        ,(3, 2)           
    exec up_MySlaveProc @table = @table        
GO         
          
-- Call the sample procs         
exec up_MyMasterProc;