使用“IN”SQL函数中的值将逗号分隔值从.NET传递到存储过程

时间:2010-11-18 13:50:35

标签: asp.net sql-server vb.net sql-server-2005

我有一个类似于以下内容的SQL查询:

create procedure test
(
   @param1 nvarchar(max)
)
as
begin
    select * from table where column1 in (@param1)
end

现在我需要从我的.net应用程序中传递@param1的值,以便上述查询能够正常工作。

有人可以告诉我如何从我的VB.NET代码传递一个类似下面的值:

'1','2','3'

我的主要问题是如何从我的.NET应用程序中构建上述参数的参数值?

3 个答案:

答案 0 :(得分:4)

很快就会这样,我会创建一个table valued function来解析它,以便你可以做到

   select * 
   from table 
   where field in (select field from dbo.myfunction(@param1))

答案 1 :(得分:3)

对于这种类型的东西,我使用这个函数并按如下方式使用它:

从我的表中选择Column1,column2,其中ID为(从fnSplit中选择项目('1,2,3,4,5,6',','))

create FUNCTION [dbo].[fnSplit](
        @sInputList VARCHAR(8000) -- List of delimited items
      , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
    ) 

RETURNS @List TABLE (item VARCHAR(8000))

BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
 BEGIN
 SELECT
  @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
  @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

 IF LEN(@sItem) > 0
  INSERT INTO @List SELECT @sItem
 END

IF LEN(@sInputList) > 0
 INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END

答案 2 :(得分:1)

我认为问题不在于你传递的价值观。 @ param1只是一个字符串。

您需要在程序中解决此问题。您的select语句将无法识别您IN子句中的值。一种解决方案是采用逗号分隔的字符串并将每个记录插入表变量Explained Here

如果您的表变量是表@param_list,则过程测试如下所示:

create procedure test ( @param1 nvarchar(max) ) 
as begin 
select * from table where column1 in (Select thefield from @param_list); 
end