代码之家  ›  专栏  ›  技术社区  ›  Degan

如何为“in”语句提供一个包含值列表的字符串

  •  0
  • Degan  · 技术社区  · 16 年前

    我正在创建一个字符串,它是一个逗号列表,通过循环遍历复选框列表中的选择来分隔值。我能够显示这个值,所以我知道它正在创建我所期望的。我正在尝试将此列表传递给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 回复  |  直到 16 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    这是因为,您试图以语句中无法完成的方式传递参数。

    看看那篇文章,它解释了你可能使用的其他方法。 SQL - Stored Procedure with Select Statement using IN (@Variable_CommaDelimitedListOfIDS)

        2
  •  0
  •   Martin Smith    16 年前

    德根。

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

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

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

    它使用的是来自 http://www.eggheadcafe.com/community/aspnet/13/10021854/fnsplit.aspx )

    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
    
    推荐文章