Je veux exécuter une instruction SELECT au sein de la CTE sur la base d'une codification. Quelque chose comme ci-dessous mais je reçois une erreur à ce sujet. Est-il possible d'avoir si d'autre au sein de CTES? Si ce n'est pas un travail autour ou une meilleure approche. P> merci. P> p>
4 Réponses :
Essayez: La clé avec une condition de recherche dynamique consiste à vous assurer qu'un index est utilisé, voici un article très complet sur la manière de gérer ce sujet: P> < P> Conditions de recherche dynamiques dans T-SQL par Erland Sommarskog P> < P> Il couvre toutes les questions et méthodes d'essayer d'écrire des requêtes avec plusieurs conditions de recherche facultatives. Cette principale chose dont vous avez besoin pour vous préoccuper n'est pas la duplication du code, mais l'utilisation d'un index. Si votre requête ne parvient pas à utiliser un index, elle préfère mal. Il existe plusieurs techniques qui peuvent être utilisées, qui peuvent ou non permettre à un index d'être utilisées. P> Voici la table des matières: p> Si vous êtes sur la version appropriée de SQL Server 2008, il existe une technique supplémentaire qui peut être utilisée, voir: Conditions de recherche dynamiques dans la version T-SQL pour SQL 2008 (SP1 CU5 et ultérieure) P> Si vous êtes sur cette version appropriée de SQL Server 2008, vous pouvez simplement ajouter considère cela, et l'optimise le temps d'exécution à être (à condition que seulement @ Search2 a été transmis avec une valeur): p> et un index peut être utilisé (si vous en avez une défini sur la colonne2) p> p> p> Option (recompiler) code> à la requête et la valeur de la variable locale au temps d'exécution est utilisée pour les optimisations. P>
option (recompiler) code> prendra ce code (où aucun index ne peut être utilisé avec ce gâchis de
ou code> s): p>
moi encore. Option (recompilation) est dans SQL 2000 + ... Optimizize pour Inconnu est nouvelle dans SQL Server 2008, qui permet à la mise en cache du plan qui recompilez pas
L'option (recompilation) n'est pas nouvelle, mais le fait qu'il considérerait les valeurs d'exécution des variables locales est nouvelle à partir de SQL 2008 (SP1 CU5 et plus tard)
Je pense que vous n'avez besoin que d'une déclaration. Voir ci-dessous.
Ne jamais essayer de mettre des conditions comme si dans une seule déclaration de requête. Même si vous réussissez à le retirer, il s'agit de la seule façon de tuer la performance. N'oubliez pas qu'une seule déclaration désigne un plan unique et le plan devra être généré de manière à satisfaire les cas em> em>, lorsque la condition est vraie et quand la condition est fausse, Votre meilleure approche, pour cela et Beaucoup de nombreuses autres raisons, consiste à tirer le si en dehors de la déclaration: p>
Je suis un peu débutant dans T-SQL. Toutes mes connaissances T-SQL sont venues en posant des questions sur Stackoverflow. Merci pour la suggestion sur la performance. Va creuser plus loin dans cela. Pour le moment, un vote up de moi.
Je pense que le si sinon pourrait avoir une mauvaise mise en cache si votre état de branche se retourne. Peut-être que quelqu'un plus compétent peut commenter. P>
Un autre moyen serait de l'union de tous avec les clauses présentées par d'autres. Le syndicat remplacerait tous le si sinon p>
Si vous utilisez un paramètre, vous n'avez besoin que d'une déclaration.
@ID (Some parameter) ;with CTE ( select * from table_A WHERE id = @ID union all select * from table_B WHERE (id = @ID and condition) )