我想知道如何将ArrayList,List <int>或StringBuilder逗号分隔列表传递给存储过程,以便使用IN()查找ID列表:
<int
@myList varchar(50) SELECT * FROM tbl WHERE Id IN (@myList)
在C#中,我目前正在将列表构建为逗号分隔的字符串。但是,例如,当使用nvarchar(50)作为存储过程中的参数类型时,我收到一个错误,因为它无法在IN()之间将‘1,2,3’转换为期望的int值。
有任何想法吗?非常感激。 皮特
您可以使用用户定义的函数,例如
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形式返回这些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