2009-02-06 52 views
2

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

@myList varchar(50) 

SELECT * 
FROM tbl 
WHERE Id IN (@myList) 

在C#中我目前建立的列表是一个字符串,这是一个逗号定界;然而,例如,当使用nvarchar(50)作为存储过程中param的类型时 - 我得到一个错误,因为它不能将'1,2,3'转换为它在IN()之间所期望的int。

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

回答

2

你可以使用一个用户自定义函数,如

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 

它接受逗号分隔的ID列表一个nvarchar并返回这些ID为int的表。然后,您可以在返回的表中加入您的存储过程,像这样 -

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 
+0

我已经把函数调用的id放到表变量中,以防您需要在存储过程的多个地方使用这些值,您只需要调用一次函数 – 2009-02-06 10:54:20

2

在SQL 2008有表值参数,使一个友好的替代解析CSV;看到这里为example

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

相关问题