2011-03-16 4 views
0

J'ai une fonction dans mon application .NET, qui doit faire une recherche d'un nombre inconnu de paramètres.Transférer le nombre dynamique de paramètres à une procédure stockée

par exemple: select * from tbl where x=1 or x=2 or x=3 or x=4

est-il possible de le faire en SQL et .Net? Comment puis-je créer des paramètres dynamiques dans .NET (je pensais le faire avec une boucle) mais comment puis-je les déclarer dans ma procédure stockée? sql a-t-il des tableaux?

aidez s'il vous plaît.

merci!

+0

quel type de base de données? MS SQL? 2005? 2008? Oracle? MySQL? – Arthur

+0

J'utilise MS SQL 2005 –

Répondre

2

Vous pouvez passer une liste séparée par des virgules, utiliser une fonction de table pour la diviser en une table, puis utiliser une clause IN. This article va plus loin.

fonction de table

:

CREATE FUNCTION dbo.funcListToTableInt(@list as varchar(8000), @delim as varchar(10)) 
RETURNS @listTable table(
    Value INT 
) 
AS 
BEGIN 
    --Declare helper to identify the position of the delim 
    DECLARE @DelimPosition INT 

    --Prime the loop, with an initial check for the delim 
    SET @DelimPosition = CHARINDEX(@delim, @list) 

    --Loop through, until we no longer find the delimiter 
    WHILE @DelimPosition > 0 
    BEGIN 
     --Add the item to the table 
     INSERT INTO @listTable(Value) 
      VALUES(CAST(RTRIM(LEFT(@list, @DelimPosition - 1)) AS INT)) 

     --Remove the entry from the List 
     SET @list = right(@list, len(@list) - @DelimPosition) 

     --Perform position comparison 
     SET @DelimPosition = CHARINDEX(@delim, @list) 
    END 

    --If we still have an entry, add it to the list 
    IF len(@list) > 0 
     insert into @listTable(Value) 
     values(CAST(RTRIM(@list) AS INT)) 

    RETURN 
END 
GO 

Ensuite, votre procédure stockée peut faire:

SELECT * 
FROM tbl 
WHERE id IN (
      SELECT Value 
      FROM funcListToTableInt(@ids,',') 
        ) 
+0

Était de ralentir, j'ai trouvé cet article: http://www.sommarskog.se/arrays-in-sql-2005.html (recherche de inline_split_me) – Arthur

+0

Je pense que cela a fonctionné! :) Je vous remercie! –

0

Essayez de passer dans une liste XML comme paramètre, vous pouvez travailler à travers les éléments dans la liste XML avec un curseur ou quelque chose de similaire

Questions connexes