2009-02-06 45 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數據類型允許您非常容易地讀取此內容(儘管需要更多傳輸字節)。

相關問題