我有一个问题,我认为这与具有多个值参数有关。
在我的WHERE语句中,有两个字段TblActivity.ActivityServActId和TblActivity.ActivityContractId,我想将它们包括在WHERE语句中。
这些过滤是可选的。如果用户为参数@YESNOActivity选择'Yes‘,那么我希望筛选查询,查找TblActivity.ActivityServActId与参数@ServiceActivity中的一个选项匹配的行。
@YESNOContract、TblActivity.ActivityContractId和@Contract也是如此。
我设法做到了:
WHERE
(CASE WHEN @YESNOActivity = 'Yes' THEN TblActivity.ActivityServActId ELSE 0 END)
IN (CASE WHEN @YESNOActivity = 'Yes' THEN @ServiceActivity ELSE 0 END)
AND (CASE WHEN @YESNOContract = 'Yes' THEN TblActivity.ActivityContractId ELSE 0 END)
IN (CASE WHEN @YESNOContract = 'Yes' THEN @Contract ELSE 0 END)但是,虽然如果参数@ServiceActivity或@Contract中只选择了一个值,那么这段代码可以正常工作,但是一旦这些参数中有多个值,我就会得到错误:
Incorrect syntax near ','.
Query execution failed for dataset 'Activity'. (rsErrorExecutingCommand)
An error has occurred during report processing. (rsProcessingAborted)有人能看出我做错了什么吗?如果我在WHERE语句中有一个=而不是IN,我就能理解它,但我无法理解这个语句。
使用Server 2008和SSRS-2008-R2
发布于 2016-01-15 16:37:16
如果您的@ServiceActivity类似于1,2,3
你可以做这样的事
WHERE `,1,2,3,` LIKE `%,1,%` 所以你格式化你的变量
WHERE ',' + @ServiceActivity + ',' LIKE '%,' + ID + ',%'SQL小提琴演示
SELECT *
FROM
(SELECT '1,2,3,4' as X UNION ALL
SELECT '2,3,4,5' as X UNION ALL
SELECT '3,4,5,6' as X UNION ALL
SELECT '1,3,4,5' as X
) as T
WHERE ',' + X + ',' LIKE '%,1,%'为你的案子
(CASE WHEN @YESNOActivity = 'Yes'
THEN ',' + @ServiceActivity + ','
ELSE NULL
END)
LIKE
(CASE WHEN @YESNOActivity = 'Yes'
THEN '%,' + TblActivity.ActivityServActId + ',%'
ELSE 0
END) 发布于 2016-01-15 16:16:39
在SQL中,IN子句不支持使用参数的方式。一般语法是
IN (1, 2, 3, 4)你有
IN (@Param)其中类似于@Param = '1,2,3,4‘的东西
在内部,SQL将将其转换为
IN ('1, 2, 3, 4')注意引号..。您现在正在匹配一个字符串!
有许多方法可以解决这一问题。搜索"sql in子句参数“,选择一个对您有用的参数,并对其进行表决。
(加)
参数化SQL子句在这个问题上似乎很明确。很久以前,我投了第三个答复的票(那个有表值参数的),但是任何一个高票数的答案都能做到这一点。理想的答案取决于你正在处理的整体问题。(我不熟悉SSRS,也不能给出更具体的建议。)
发布于 2016-05-03 14:37:25
因此,在经过了大量的混乱之后,我找到了一个简单的解决办法,完全放弃了我对案例的使用--但我怀疑这并不是一种非常有效的做事方式。
WHERE
(@YESNOActivity = 'No' OR (@YESNOActivity = 'Yes' AND
TblActivity.ActivityServActId IN (@ServiceActivity)))
AND
(@YESNOContract = 'No' OR (@YESNOContract = 'Yes' AND
TblActivity.ActivityContractId IN (@Contract)))https://stackoverflow.com/questions/34814908
复制相似问题