J'ai essayé de résoudre ce problème en postant d'autres questions connexes ici qui se concentraient sur des parties de la requête. Cependant, je pourrais tout aussi bien afficher le tout et voir si quelqu'un peut aider. Je les tableaux ci-dessous avec les champs suivants:T-SQL - Comment écrire une jointure conditionnelle complexe incluant une jointure plusieurs-à-plusieurs
tblPerson - personID, NomPersonne
tblGroup - GroupID, Nom
tblGroupMembership - PersonID, GROUPID
tblPersonCities - CityID, personID, Ville
Il est un assez simple installer. Nous avons la personne et le groupe et le GroupMembership est un nombre de beaucoup à se joindre entre les deux. Et puis les gens peuvent avoir plusieurs villes.
Ce que j'essaie de faire est d'écrire une procédure stockée pour rechercher ces données basées sur quelques paramètres différents. La procédure stockée ne renvoie que des informations sur la personne. La procédure stockée doit prendre 3 paramètres:
@PersonName - nom ou d'une partie d'une personne du nom d'une personne
@GroupIDList - une liste délimitée par des virgules groupids
@city - un nom de ville ou d'une partie d'un nom de ville
Je souhaite que la procédure stockée ne puisse pas exiger de valeurs pour l'un des paramètres. Donc, si tous les paramètres étaient NULL, il devrait retourner tous les enregistrements Person. Si une liste d'ID de groupe est transmise, elle ne doit renvoyer que les enregistrements de personne qui correspondent à TOUS les groupes dans la liste transmise. J'espère avoir expliqué cela correctement. Je sais que c'est une longue question, mais je ne peux pas l'expliquer autrement. J'ai du code qui fonctionne presque. Le seul problème est que cela ne semble pas fonctionner si tous les paramètres sont NULL. (Et je n'ai pas compris comment amener dans la ville) Voici mon exemple de code. (REMARQUE: fnSplit est une fonction personnalisée qui prend une chaîne délimitée par des virgules et retourne une table avec les différentes valeurs)
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 + '%'))
J'avais toujours supposé que SQL dynamique était mauvais parce qu'il ne serait pas mis en cache par le serveur et serait beaucoup plus lent. Je veux bien essayer. –