changement recherche Dynamiquement en fonction des paramètres donnés est un sujet complexe et de le faire d'une manière sur une autre, même avec seulement une différence très légère, peut avoir des conséquences énormes de performance. La clé est d'utiliser un index, ignorer le code compact, ignorer s'inquiéter de répéter le code, vous devez faire un bon plan d'exécution de la requête (utiliser un index).
Lisez ceci et considérez toutes les méthodes. Votre meilleure méthode dépendra de vos paramètres, vos données, votre schéma et votre utilisation réelle:
Dynamic Search Conditions in T-SQL by by Erland Sommarskog
The Curse and Blessings of Dynamic SQL by Erland Sommarskog
cela produira le meilleur plan d'exécution:
IF @flag=1
BEGIN
SELECT
[field]
FROM [table]
WHERE col1 = @value
END
ELSE
BEGIN
SELECT
[field]
FROM [table]
WHERE col2 = @different_value
END
Cependant , si vous devez avoir une seule requête, ceci est votre meilleur pari à l'aide d'un index
SELECT
[field]
FROM [table]
WHERE @flag=1
AND col1 = @value
UNION ALL
SELECT
[field]
FROM [table]
WHERE @flag!=1
AND col2 = @different_value
Excellent. Premier passage, on dirait que ça marche. Je vais continuer à tester, mais je pense que c'est un essai. Simple aussi. Merci! – Peter
il n'y a aucune chance d'utilisation d'index avec ceci, sauf si vous incluez OPTION (RECOMPILE) et exécutez sur une certaine version de SQL Server 2008, voir ceci, des liens dans ma réponse [Un conte de Service Packs et Mises à jour cumulatives] http://www.sommarskog.se/dyn-search-2008.html#SPandCUs). Ce lien explique comment les dernières versions de 2008 peuvent recompiler la requête en prenant en compte la valeur d'exécution des variables locales. quand cela est fait, des choses comme '(@flag = 1 et col1 = @value)' peuvent être optimisées hors de la requête si @flag n'est pas 1 et si elle est 1, alors optimisé pour être simplement 'col1 = @ value' –
Je cours SQL Server 2005, donc je suppose qu'il ne sera pas encore optimisé. – Peter