Если идея состоит в том, чтобы не фильтровать по Col3
, если @list
равно нулю, тогда вы могли бы сделать это так же
Declare @list varchar(100), @Col2 varchar(100)
SELECT *
FROM Table1 t1
INNER JOIN dbo.Table2 t2
on t1.Col1 = t2.Col1
where t1.Col2 = ISNULL(@Col2,t1.Col2)
AND (@list IS NULL OR t1.Col3 IN (select * from dbo.SplitMe(@list)))
, но это было бы не очень хорошоИдея, если таблицы очень маленькие.По причинам кэширования плана обычно лучше разбить все эти перестановки на их собственные операторы SQL, а не пытаться написать один размер, подходящий для всего запроса, или (если число перестановок становится слишком большим) рассмотреть возможность использования динамического SQL (см. DynamicУсловия поиска в T-SQL )
Обратите внимание, что не гарантирует, что функция Split не будет вызвана.Не существует гарантированного порядка оценки пунктов.Но это означает, что если он будет вызван, это не повлияет на результат запроса.( Редактировать при условии, конечно, что вызов, когда NULL
на самом деле не вызывает какую-то ошибку, см. Комментарий Ремуса)