2011-02-14 6 views
0

Je souhaite exécuter une instruction select SQL similaire à ceAvoir plusieurs valeurs affectées à un seul paramètre ADO.Net SqlClient

SELECT * FROM CatalogueItems WHERE id IN (1,10,15,20); 

utilisant des paramètres de @name de style ADO.Net SqlClient. Je l'ai essayé d'utiliser une des chaînes SQL stockées

SELECT * FROM CatalogueItems WHERE id IN (@Ids) 

puis dans mon code C#

SqliteCommand command; 
//... 
//returns 0 results 
command.Parameters.Add("@Ids", null).Value = "1,10,15,20"; 

//returns 0 results 
command.Parameters.Add("@Ids", DbType.String).Value = "1,10,15,20"; 

//returns 1 or more results 
command.Parameters.Add("@Ids", null).Value = "1"; 

retourne un jeu de résultats vide, mais les paramètres de chaîne individuels des résultats.

Cette requête est-elle compatible? Y a-t-il un autre DBType que je devrais utiliser?

Merci.

Répondre

1

Vous ne pouvez pas faire cela. Un paramètre SQL-Server doit être une valeur unique. Mais vous pouvez jeter un oeil here pour construire la liste des paramètres de façon dynamique. Editer: si vous utilisez SQl-Server> = 2008, vous pouvez utiliser Table-valued parameters comme suggéré dans this answer. C'est nouveau pour moi, mais je suis en 2005 malheureusement.

Une autre option serait de créer une fonction définie par l'utilisateur qui retourne une table de votre csv-chaîne comme ceci:

CREATE FUNCTION [dbo].[Split] 
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @IDTable TABLE (Item VARCHAR(50)) 
AS  

BEGIN  
    DECLARE @tempItemList NVARCHAR(MAX) 
    SET @tempItemList = @ItemList 

    DECLARE @i INT  
    DECLARE @Item NVARCHAR(4000) 

    SET @tempItemList = REPLACE (@tempItemList, ' ', '') 
    SET @i = CHARINDEX(@delimiter, @tempItemList) 

    WHILE (LEN(@tempItemList) > 0) 
    BEGIN 
     IF @i = 0 
      SET @Item = @tempItemList 
     ELSE 
      SET @Item = LEFT(@tempItemList, @i - 1) 
     INSERT INTO @IDTable(Item) VALUES(@Item) 
     IF @i = 0 
      SET @tempItemList = '' 
     ELSE 
      SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i) 
     SET @i = CHARINDEX(@delimiter, @tempItemList) 
    END 
    RETURN 
END 

Ensuite, vous pouvez utiliser cette fonction pour diviser de votre carte d'identité et rejoindre avec votre jeu de résultats Tels que ceci:

SELECT CatalogueItems .* 
FROM CatalogueItems INNER JOIN 
     dbo.Split(@Ids, ',') AS IdList ON CatalogueItems.ID = IdList.Item 

Dans ce cas, un paramètre string-pour tous les numéros d'identification suffit.

+0

Merci Tim. Le lien fourni vous fourni fourni la solution parfaite. À votre santé. – ajmccall

Questions connexes