IN
не работает, WHERE rolename IN ('A,B,C')
будет эквивалентно WHERE rolename = 'A,B,C'
. IN
принимает список скалярных значений (например, 'A','B','C'
), а не скалярное значение с разделителями (например, 'A,B,C'
).
Предполагая, что вы используете современную версию SQL Server, тогда вам нужно будет использовать STRING_SPLIT
для работы со скалярным значением с разделителями L
WHERE rolename IN (SELECT value FROM STRING_SPLIT(@Network,','))
Если, однако, вы хотите передать параметр «показать все», тогда обычно вам лучше передать NULL
:
WHERE (rolename IN (SELECT value FROM STRING_SPLIT(@Network,','))
OR @Network IS NULL)
Если вы должны передать 'showall'
, сделайте это значение @Network
, а не 'showall,A,B,C'
, а затем просто замените @Network IS NULL
на @Network = 'showall'
Обратите внимание, что с такими запросами вы, вероятно, столкнетесь с плохим кэшированием плана запроса. Если запрос будет таким же простым, как приведенные выше предложения WHERE
, то простое добавление OPTION (RECOMPILE)
позволит обойти это; поскольку он заставляет механизм данных каждый раз воссоздавать план запроса. Однако, если ваш запрос более сложный, тогда вам будет лучше пойти по маршруту запроса Dynami c и включить предложение rolename IN (SELECT value FROM STRING_SPLIT(@Network,',')
только при необходимости.