首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WHERE语句中使用参数具有多个值的情况

在WHERE语句中使用参数具有多个值的情况
EN

Stack Overflow用户
提问于 2016-01-15 15:52:13
回答 3查看 1.3K关注 0票数 1

我有一个问题,我认为这与具有多个值参数有关。

在我的WHERE语句中,有两个字段TblActivity.ActivityServActIdTblActivity.ActivityContractId,我想将它们包括在WHERE语句中。

这些过滤是可选的。如果用户为参数@YESNOActivity选择'Yes‘,那么我希望筛选查询,查找TblActivity.ActivityServActId与参数@ServiceActivity中的一个选项匹配的行。

@YESNOContractTblActivity.ActivityContractId@Contract也是如此。

我设法做到了:

代码语言:javascript
复制
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中只选择了一个值,那么这段代码可以正常工作,但是一旦这些参数中有多个值,我就会得到错误:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-15 16:37:16

如果您的@ServiceActivity类似于1,2,3

你可以做这样的事

代码语言:javascript
复制
WHERE  `,1,2,3,` LIKE `%,1,%` 

所以你格式化你的变量

代码语言:javascript
复制
WHERE  ',' + @ServiceActivity + ',' LIKE '%,' + ID + ',%'

SQL小提琴演示

代码语言:javascript
复制
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,%'

为你的案子

代码语言:javascript
复制
(CASE WHEN @YESNOActivity = 'Yes' 
           THEN ',' + @ServiceActivity + ','
           ELSE NULL 
 END)
LIKE
(CASE WHEN @YESNOActivity = 'Yes' 
           THEN '%,' + TblActivity.ActivityServActId + ',%'
           ELSE 0 
 END) 
票数 2
EN

Stack Overflow用户

发布于 2016-01-15 16:16:39

在SQL中,IN子句不支持使用参数的方式。一般语法是

代码语言:javascript
复制
IN (1, 2, 3, 4)

你有

代码语言:javascript
复制
IN (@Param)

其中类似于@Param = '1,2,3,4‘的东西

在内部,SQL将将其转换为

代码语言:javascript
复制
IN ('1, 2, 3, 4')

注意引号..。您现在正在匹配一个字符串!

有许多方法可以解决这一问题。搜索"sql in子句参数“,选择一个对您有用的参数,并对其进行表决。

(加)

参数化SQL子句在这个问题上似乎很明确。很久以前,我投了第三个答复的票(那个有表值参数的),但是任何一个高票数的答案都能做到这一点。理想的答案取决于你正在处理的整体问题。(我不熟悉SSRS,也不能给出更具体的建议。)

票数 2
EN

Stack Overflow用户

发布于 2016-05-03 14:37:25

因此,在经过了大量的混乱之后,我找到了一个简单的解决办法,完全放弃了我对案例的使用--但我怀疑这并不是一种非常有效的做事方式。

代码语言:javascript
复制
WHERE
(@YESNOActivity = 'No' OR (@YESNOActivity = 'Yes' AND
TblActivity.ActivityServActId IN (@ServiceActivity)))

AND

(@YESNOContract = 'No' OR (@YESNOContract = 'Yes' AND
TblActivity.ActivityContractId IN (@Contract)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34814908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档