Я попытался решить эту проблему, разместив здесь другие связанные вопросы, посвященные частям запроса. Однако я мог бы также опубликовать все это и посмотреть, если кто-нибудь может помочь. У меня есть следующие таблицы со следующими полями:
tblPerson - PersonID, PersonName
tblGroup - GroupID, Имя
tblGroupMembership - PersonID, GroupID
tblPersonCities - CityID, PersonID, City
Это довольно простая установка. У нас есть Персона и Группа, а членство в Группе - это соединение многих со многими. И тогда у людей может быть несколько городов.
Что я пытаюсь сделать, это написать хранимую процедуру для поиска этих данных, основанную на нескольких различных параметрах. Хранимая процедура будет возвращать только информацию о человеке. Хранимая процедура должна принимать 3 параметра:
@ PersonName - имя человека или часть имени человека
@GroupIDList - список идентификаторов групп, разделенных запятыми
@City - название города или часть названия города
Я бы хотел, чтобы хранимая процедура не требовала значений ни для одного из параметров. Таким образом, если все параметры были NULL, он должен возвращать все записи Person. Если передается список GroupID, то он должен возвращать только записи Person, которые соответствуют ВСЕМ группам в переданном списке. Я надеюсь, что объяснил это правильно. Я знаю, что это длинный вопрос, но я не могу объяснить это по-другому. У меня есть код, который почти работает. Единственная проблема заключается в том, что он не работает, если все параметры равны NULL. (И я не понял, как привезти в город) Вот мой пример кода. (ПРИМЕЧАНИЕ: fnSplit - это пользовательская функция, которая принимает строку с разделителями-запятыми и возвращает таблицу с другими значениями)
declare @name varchar(50)
declare @city varchar(50)
declare @grouplist varchar(50)
set @name = null
set @city = null
set @grouplist = null
select distinct
p.PersonID,
p.PersonName,
c.City
from
tblPerson p left join tblCities c on p.PersonID = c.PersonID
join
(
select m.PersonID
from tblGroupMembership m
where (m.GroupID in (select item from fnSplit(@grouplist, ',')))
group by m.PersonID
having (count(*) = (select count(*) from fnSplit(@grouplist, ',')))
) as filter
on (@grouplist is not null) and (p.PersonID = filter.PersonID)
where
((@name is null) or (p.PersonName like '%' + @name + '%')) and
((@city is null) or (c.City like '%' + @city + '%'))