2011-03-16 146 views
0

我在我的.NET应用程序中有一个函数,它需要搜索未知数量的参数。将动态数量的参数传递给存储过程

例如:select * from tbl where x=1 or x=2 or x=3 or x=4

,才有可能在.NET和SQL办?我如何去在.NET中创建动态参数(我正在考虑用循环做),但是如何在我的存储过程中声明它们? sql有数组?

请大家帮忙。

谢谢!

+0

什么样的数据库? MS SQL? 2005年? 2008年?甲骨文? MySQL的? – Arthur 2011-03-16 16:11:47

+0

我正在使用MS SQL 2005 – 2011-03-16 16:12:25

回答

2

您可以传入一个逗号分隔列表,使用表函数将其拆分为表,然后使用IN子句。 This article就这样做了。

表功能:

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 

那么你的存储过程可以这样做:

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

是减慢,我发现这篇文章:http://www.sommarskog.se/arrays-in-sql-2005.html(搜索inline_split_me) – Arthur 2011-03-16 16:14:38

+0

我认为它的工作! :) 谢谢! – 2011-03-16 16:26:16

0

尝试在XML列表中传递的参数,那么你可以通过在XML列表中的项目工作用光标或类似的东西

相关问题