Вы можете прибегнуть к Dynamic SQL и обернуть все в хранимую процедуру.
Если вы получите параметр LIKE IN в строке как токены с определенным разделителем, например
'% Main Street,foo %,Another%Street'
сначала вам нужно создать функцию, которая получает список LIKE "токенов" и возвращает их таблицу.
CREATE FUNCTION [dbo].[SplitList]
(
@list nvarchar(MAX),
@delim nvarchar(5)
)
RETURNS @splitTable table
(
value nvarchar(50)
)
AS BEGIN
While (Charindex(@delim, @list)>0) Begin
Insert Into @splitTable (value)
Select ltrim(rtrim(Substring(@list, 1, Charindex(@delim, @list)-1)))
Set @list = Substring(@list, Charindex(@delim, @list)+len(@delim), len(@list))
End
Insert Into @splitTable (value) Select ltrim(rtrim(@list))
Return
END
Тогда в SP у вас есть следующий код
declare
@sql nvarchar(MAX),
@subWhere nvarchar(MAX)
@params nvarchar(MAX)
-- prepare the where sub-clause to cover LIKE IN (...)
-- it will actually generate where sub clause StreetName Like option1 or StreetName Like option2 or ...
set @subWhere = STUFF(
(
--(**)
SELECT ' OR StreetName like ''' + value + '''' FROM SplitList('% Main Street,foo %,Another%Street', ',')
FOR XML PATH('')
), 1, 4, '')
-- create the dynamic SQL
set @sql ='select * from [Street]
where
(' + @subWhere + ')
-- and any additional query params here, if needed, like
AND StreetMinHouseNumber = @minHouseNumber
AND StreetNumberOfHouses between (@minNumberOfHouses and @maxNumberOfHouses)'
set @params = ' @minHouseNumber nvarchar(5),
@minNumberOfHouses int,
@minNumberOfHouses int'
EXECUTE sp_executesql @sql, @params,
@minHouseNumber,
@minNumberOfHouses,
@minNumberOfHouses
Конечно, если у вас есть параметры LIKE IN в другой таблице или вы собираете их с помощью запроса, вы можете заменить их в строке (**)