我正在通过循环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查询,但我还没有找到合适的格式化来完成这项工作。看起来格式化就是问题,但也许我错过了其他的东西。
答案 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