如何为“IN”语句提供带有值列表的字符串

时间:2010-05-23 19:34:56

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

我正在通过循环CheckBoxList中的选择来创建一个字符串,该字符串是逗号分隔值的列表。我能够显示这个值,所以我知道它正在创造我所期望的。我试图将此列表传递给SELECT查询中的IN语句:

SelectCommand="SELECT ThisDate, DATEPART(dw, ThisDate) AS Expr1 FROM fbCalendar WHERE (ThisDate >= @ThisDate) AND (ThisDate <= @ThisDate2) AND (DATEPART(dw, ThisDate) IN (@TheseDays))"

<asp:ControlParameter ControlID="Label1" Name="TheseDays" PropertyName="Text" Type="String" />  

只要选择了一个项目,这样就可以正常工作,但选择第二个项目会失败并显示以下消息: 将nvarchar值'4,5'转换为数据类型int时转换失败。

但是,我不明白何时将其转换为INT。我已尝试过许多不同的格式化尝试(例如将字符串封装在括号中(例如“(4,5)”)用于SELECT查询,但我还没有找到合适的格式化来完成这项工作。看起来格式化就是问题,但也许我错过了其他的东西。

2 个答案:

答案 0 :(得分:1)

这是因为,您尝试使用IN语句无法完成的方式传递参数。

看一下这个帖子,它解释了你可以使用的其他方法。 SQL - Stored Procedure with Select Statement using IN (@Variable_CommaDelimitedListOfIDS)

答案 1 :(得分:0)

德感。

  

我创建了一个表来存储要传递给查询的值。它只是   似乎不对。

您不必创建实际的表。您可以使用表值函数并在查询中使用它,例如如下。

(DATEPART(dw, ThisDate) IN (SELECT [item] FROM dbo.fnSplit(@TheseDays, ',')))

这使用来自http://www.eggheadcafe.com/community/aspnet/13/10021854/fnsplit.aspx的TVF。

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
GO