Se ho capito bene devi prima crearti il tuo tipo (immagine in allegato), come spiegato qui: http://msdn.microsoft.com/en-us/library/bb522526.aspx.
A te serve che contenga un solo campo di tipo int.
Se ho capito bene puoi passare alla store procedure il parametro che conterrà il tuo table-type SOLO partendo da un oggetto di tipo DataReader, DataTable o un IEnumerable (come dice qui: http://msdn.microsoft.com/en-us/library/bb675163.aspx).
Ad esempio per passare come parametro un array di id ruoli ho fatto:
CREATE TYPE RoleIdsParameter AS TABLE
(
roleId int
)
Poi l'ho testata così (query in Sql Server Management Studio):
declare @ids as RoleIdsParameter;
insert into @ids (roleId)
values (1), (2), (3); -- <<< equivale ad inserire 3 rows (usa table-valued del Sql 2008)
-- se i campi fossero di più sarebbe:
-- values (1, 'record 1', getDate()), (2, 'record 2', getDate()), (3, 'record 3', getDate())
select * from Roles
where id in (select roleId from @ids);
-- so che IN è da evitare, provo così (non so se corretto):
select Roles.* from Roles
inner join @ids as RoleFilter on Roles.id = RoleFilter.roleId;
E adesso provo a richiamarla da codice, come dice qui: http://msdn.microsoft.com/en-us/library/bb675163.aspx
Non posso provarla perchè non ho il SqlCommand a portata di mano, uso un oggetto di libreria che accetta la stringa (query o nome della store procedure), la estringa di connessione e la lista di parametri, e fa il "lavoro sporco" dietro le quinte senza farmi toccare la connessione e gestendo automaticamente la creazione del SqlCommand.
Questo modo di procedere non mi ha mai dato problemi tranne che ora, spero di trovare (quando ne avrò bisogno) il modo di usarla senza modificare la libreria.
Ciao