@Network = 'showall,A,B,C' or @Network = 'A,B,C'
什么时候 'showall'
如果存在,我需要显示所有记录,但如果找不到,我需要根据列表中的内容过滤记录。
WHERE rolename in ('A','B','C')
我已经能够这样做的最后一部分
SET @Network = '''' + replace(@Network, ',',''',''') + '''';
where rolename in (@Network);`
@Network = 'showall,A,B,C' or @Network = 'A,B,C'
什么时候 'showall'
如果存在,我需要显示所有记录,但如果找不到,我需要根据列表中的内容过滤记录。
WHERE rolename in ('A','B','C')
我已经能够这样做的最后一部分
SET @Network = '''' + replace(@Network, ',',''',''') + '''';
where rolename in (@Network);`
2条答案
按热度按时间4sup72z81#
您可以使用:
aurhwmvo2#
IN
不是那样工作的,WHERE rolename IN ('A,B,C')
相当于WHERE rolename = 'A,B,C'
.IN
获取标量值列表(例如。'A','B','C'
),而不是分隔的标量值(例如。'A,B,C'
).假设您使用的是sql server的现代版本,那么您需要使用
STRING_SPLIT
使用分隔标量值的步骤但是,如果您想传递一个“show all”参数,那么通常您最好传递它
NULL
:如果你必须通过
'showall'
让它成为@Network
,不是'showall,A,B,C'
,然后替换@Network IS NULL
与@Network = 'showall'
请注意,对于这样的查询,您可能会遇到查询计划缓存不佳的问题。如果你的查询和上面一样简单WHERE
子句,然后简单地添加OPTION (RECOMPILE)
会绕过这个;因为它每次都强制数据引擎重新创建查询计划。但是,如果您认为查询更复杂,那么实际上最好采用动态查询路线,只包含rolename IN (SELECT value FROM STRING_SPLIT(@Network,',')
必要时提供条款。