Ceci est en quelque sorte une suite à Slow Exists Check. La suggestion d'Alex fonctionne et évite avec succès la répétition du code, mais je me retrouve quand même avec un deuxième problème. Considérons l'exemple ci-dessous (De AlexKuznetsov). Dans celui-ci, j'ai deux branches pour gérer 1 contrainte. Si j'avais 2 contraintes optionnelles, je me retrouverais avec 4 branches. Fondamentalement, le nombre de branches augmente exponentiellement avec le nombre de contraintes. D'un autre côté, si j'utilise une fonction de table multi-instructions ou si j'utilise des tables temporaires, l'optimiseur de requêtes SQL ne peut pas m'aider, donc les choses deviennent plus lentes. Je suis un peu méfiant de SQL dynamique (et j'ai entendu dire que c'est lent, aussi).Gestion efficace de plusieurs contraintes optionnelles dans la clause Where
Quelqu'un peut-il offrir des suggestions sur la façon d'ajouter plus de contraintes sans ajouter beaucoup d'instructions if?
Note: J'ai déjà essayé de chaîner x is null or inpo = @inpo
ensemble, mais c'est très lent. Gardez à l'esprit que même si le test inpo = @inpo
peut être géré via une sorte de magie noire d'indexation, le test de nullité finit par être évalué pour chaque ligne de la table.
IF @inpo IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo
ORDER BY c;
END
Variation Deux: 2 contraintes:
IF @inpo IS NULL BEGIN
IF @inpo2 IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo2 = @inpo2
ORDER BY c;
END
END ELSE BEGIN
IF @inpo2 IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo AND
inpo2 = @inpo2
ORDER BY c;
END
END
Grande trouvaille. Obtient mon +1 –
Excellente référence +1 –