10
votes

Si sinon au sein de la CTE?

Je veux exécuter une instruction SELECT au sein de la CTE sur la base d'une codification. Quelque chose comme ci-dessous xxx

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.

merci.


0 commentaires

4 Réponses :


23
votes

Essayez: xxx

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> Conditions de recherche dynamiques dans T-SQL par Erland Sommarskog < 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.

Voici la table des matières: xxx

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)

Si vous êtes sur cette version appropriée de SQL Server 2008, vous pouvez simplement ajouter Option (recompiler) à la requête et la valeur de la variable locale au temps d'exécution est utilisée pour les optimisations.

considère cela, option (recompiler) prendra ce code (où aucun index ne peut être utilisé avec ce gâchis de ou s): xxx

et l'optimise le temps d'exécution à être (à condition que seulement @ Search2 a été transmis avec une valeur): xxx

et un index peut être utilisé (si vous en avez une défini sur la colonne2)


3 commentaires

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.



4
votes

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 , lorsque la condition est vraie et quand la condition est fausse, à la fois . Cela entraîne généralement dans le plan pire possible, car la "condition" crée généralement un chemin d'accès mutuellement exclusif pour le plan et l'union des deux résultats dans la numérisation de table de bout en bout.

Votre meilleure approche, pour cela et Beaucoup de nombreuses autres raisons, consiste à tirer le si en dehors de la déclaration: xxx




0
votes

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)
)


0 commentaires