【问题标题】:How do I provide a string with a list of values to an "IN" statement [duplicate]如何为“IN”语句提供带有值列表的字符串[重复]
【发布时间】:2010-05-23 19:34:56
【问题描述】:

我正在创建一个字符串,该字符串是一个逗号分隔值的列表,方法是遍历 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。我已经为 SELECT 查询尝试了许多不同的格式化尝试(例如将字符串封装在括号中(例如 "(4,5)" ),但我还没有找到合适的方法来完成这项工作。似乎格式化是问题,但也许我还缺少其他东西。

【问题讨论】:

  • 我创建了一个表来存储要传递给查询的值。只是看起来不太对。
  • 问题在于 IN 语句需要在列表中的每个字符串项周围打勾:IN('4', '5') 并且您的进程正在传入 ('4, 5')跨度>

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


【解决方案1】:

德根。

我创建了一个表来存储要传递给查询的值。这只是 好像不太对。

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

(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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 2015-08-23
    • 2021-06-19
    • 2012-08-25
    • 1970-01-01
    • 2016-12-12
    • 2020-07-30
    • 2010-10-14
    相关资源
    最近更新 更多