SQL Server(2008)将ArrayList或String传递给SP for IN()

我想知道如何将ArrayList,List <int >或StringBuilder逗号分隔列表传递给存储过程,以便使用IN()找到ID列表:

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

在C#中,我目前正在将列表构建为逗号分隔的字符串; 但是当使用nvarchar(50)时,作为存储过程中param的类型 – 我得到一个错误,因为它无法将’1,2,3’转换为它在IN()之间预期的int。

有任何想法吗? 非常感激。
皮特

您可以使用用户定义的function,例如

 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 

它接受一个nvarchar逗号分隔的id列表,并以int的forms返回这些id的表。 然后,您可以在存储过程中加入返回的表,如下所示 -

 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 

在SQL 2008中,有表值参数,它们是解析CSV的友好替代方案; 在这里看一个例子 。

否则,另一个选项是xml – SQL Server中的xml数据类型允许您非常容易地读取它(尽管它需要更多的传输字节)。