SQL Server (2008) Passa ArrayList o String a SP per IN ()

Mi stavo chiedendo come sia ansible passare una lista delimitata da ArrayList, List <int > o StringBuilder a una stored procedure in modo tale da trovare un elenco di ID usando IN ():

 @myList varchar(50) SELECT * FROM tbl WHERE Id IN (@myList) 

In C # sto costruendo l’elenco come una stringa che è delimitata da virgole; tuttavia quando si utilizza nvarchar (50) ad esempio, come il tipo per il parametro nella stored procedure, viene visualizzato un errore poiché non può convertire ‘1,2,3’ in int che si aspetta tra IN ().

Qualche idea? Molto apprezzato.
Pete

È ansible utilizzare una funzione definita dall’utente come

 CREATE function [dbo].[csl_to_table] ( @list nvarchar(MAX) ) RETURNS @list_table TABLE ([id] INT) AS BEGIN DECLARE @index INT, @start_index INT, @id INT SELECT @index = 1 SELECT @start_index = 1 WHILE @index < = DATALENGTH(@list) BEGIN IF SUBSTRING(@list,@index,1) = ',' BEGIN SELECT @id = CAST(SUBSTRING(@list, @start_index, @index - @start_index ) AS INT) INSERT @list_table ([id]) VALUES (@id) SELECT @start_index = @index + 1 END SELECT @index = @index + 1 END SELECT @id = CAST(SUBSTRING(@list, @start_index, @index - @start_index ) AS INT) INSERT @list_table ([id]) VALUES (@id) RETURN END 

Che accetta un elenco di id separati da virgola nvarchar e restituisce una tabella di questi id come ints. È quindi ansible partecipare alla tabella restituita nella stored procedure in questo modo -

 DECLARE @passed_in_ids TABLE (id INT) INSERT INTO @passed_in_ids (id) SELECT id FROM [dbo].[csl_to_table] (@your_passed_in_csl) SELECT * FROM myTable INNER JOIN @passed_in_ids ids ON myTable.id = ids.id 

In SQL 2008 ci sono parametri con valori di tabella, che rendono un’alternativa amichevole all’analisi di CSV; vedi qui per un esempio .

Altrimenti, un’altra opzione è xml: il tipo di dati xml in SQL Server consente di leggerlo abbastanza facilmente (anche se richiede più byte di trasferimento).