2009-02-06 4 views
2

Je me demandais comment je peux passer une liste délimitée par des virgules ArrayList, List <int> ou StringBuilder à une procédure stockée de sorte que je trouve une liste d'ID en utilisant IN():SQL Server (2008) Passer ArrayList ou chaîne à SP pour IN()

@myList varchar(50) 

SELECT * 
FROM tbl 
WHERE Id IN (@myList) 

En C# Je construis actuellement la liste sous la forme d'une chaîne délimitée par des virgules; cependant en utilisant nvarchar (50) par exemple, comme type pour le param dans la procédure stockée - j'obtiens une erreur car il ne peut pas convertir '1,2,3' en int ce qu'il attend entre les IN().

Des idées? Très appréciée.
Pete

Répondre

2

Vous pouvez utiliser une fonction définie par l'utilisateur tels que

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 

qui accepte une nvarchar séparées par des virgules liste des ids et retourne une table de ces Ids ints. Vous pouvez ensuite rejoindre sur la table de retour dans votre procédure stockée comme si -

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

J'ai mis les identifiants de l'appel de fonction dans une variable de table au cas où vous devriez utiliser ces valeurs à plus d'un endroit dans votre procédure stockée, vous devez seulement appeler la fonction une fois –

2

Dans SQL Server 2008, il y a paramètres_réseau valeur table, qui font une alternative conviviale à l'analyse syntaxique CSV; Voir ici pour un example.

Sinon, une autre option est xml - le type de données xml dans SQL Server vous permet de lire ceci assez facilement (bien qu'il nécessite plus d'octets de transfert).

Questions connexes