Мне нужно внутреннее соединение, основанное на значении параметра, который у меня есть в хранимой процедуре.Я также использую функцию для разделения значений из строки значений, разделенных запятыми.Мой код выглядит следующим образом:
Select *
from view_Project as vp
join inline_split_me(@earmark) as e on (vp.EarmarkId LIKE e.Value and @earmark IS NOT NULL)
Если @earmark равен NULL, тогда я не хочу, чтобы это соединение вообще происходило, в противном случае, если у меня есть строка '%' или '119' или '119,120,121'это объединение должно произойти и дает правильные результаты.Я просто хотел бы, чтобы это вообще не происходило, если @earmark равен нулю, я подумал, что могу просто использовать и @earmark не равен нулю, чтобы обозначить, что, однако, он не возвращает правильные результаты, которые обнаруживаются при комментировании объединенияline и запускает тот же sproc со значением null, что и параметр @earmark, что дает мне все строки в результате.Когда я сохраняю это соединение и пропускаю ноль, я не получаю строк, я возился с этим в течение некоторого времени, любая помощь будет оценена.
Вот ФУНКЦИЯ:
[inline_split_me](@param nvarchar(MAX))
RETURNS TABLE AS
RETURN(SELECT ltrim(rtrim(convert(nvarchar(4000),
substring(@param, Number,
charindex(N',' COLLATE SQL_Latin1_General_CP1_CI_AS,
@param + convert(nvarchar(MAX), N','),
Number) -
Number)
))) AS Value
FROM APM_Numbers
WHERE Number <= convert(int, len(@param))
AND substring(convert(nvarchar(MAX), N',') + @param, Number, 1) =
N',' COLLATE SQL_Latin1_General_CP1_CI_AS)
Понял, спасибо Кейд Ру и другим
if (@earmark = '%')
select *
from view_Project as vp
where vp.EarmarkId like @earmark
else
select *
from view_Project as vp
where @earmark is null or vp.EarmarkId in (select Value from inline_split_me(@earmark))