2010-03-24 2 views
0

Je cherche un moyen d'ajouter dynamiquement un filtre à mon état sans utiliser SQL dynamique.T-SQL: Clé Dynamic Where de l'instruction SQL normale

Je souhaite sélectionner tous les ordinateurs d'une table, mais lorsque je transmets un identifiant d'ordinateur au sp, je souhaite obtenir uniquement cet ordinateur.

En fait, j'essayer ceci sur

DECLARE @ComputerFilter AS INT 
DECLARE @ComputerID AS INT 

SELECT Computername 
FROM Computer 
WHERE (ComputerID = @ComputerID) OR (@ComputerFilter IS NULL)) 

Mais cela est 100 fois lent alors ce statment et Touque aussi longtemps que SELECT * FROM Computer

SELECT Computername 
FROM Computer 
WHERE ComputerID = @ComputerID 

Y at-il un moyen d'accélérer cette statment up ou existe-t-il un autre moyen de résoudre ce problème avec un select und sans SQL dynamique?

+0

Que doit faire le système lorsque @ComputerFilter n'est pas nul? – Thomas

+0

Ensuite, il filtre par l'ordinateur :) D'accord, je peux écrire (ComputerID = @ ComputerID) OU (@ ComputerID est nul) – Torben

Répondre

1

DECLARE @ComputerID AS INT

SET @ComputerID = null -- fro all null or just id for one 

SELECT Computername 
FROM Computer 
WHERE ComputerID = ISNULL(@ComputerID, ComputerID ) 

Lorsque vous ne avez pas besoin

+0

Bonjour, bonne solution, merci. Mais le serveur effectue également un index scan. Peut-être que je dois utiliser deux déclaration pour obtenir des performances :( – Torben

4

La méthode la plus simple serait d'utiliser l'instruction IF.

IF @ComputerID IS NULL BEGIN 
    SELECT Computername 
    FROM Computer 
END 
ELSE BEGIN 
    SELECT Computername 
    FROM Computer 
    WHERE ComputerID = @ComputerID 
END 
+0

Cela semble être l'option la plus simple. –

+0

Je suis d'accord IMO IF/ELSE est la meilleure solution. @grzegorz, vous ici ?! :) – htaler

+0

Oui. Je suis. Depuis SO beta privée. –

0

SQL Server est souvent mal à l'optimisation des requêtes avec une OR dans la clause WHERE. Parfois, un UNION ou UNION ALL est mieux. Dans votre cas, effectuez @ComputerFilter IS NULL contrôle d'abord dans la déclaration dans IF, et faire juste un SELECT sans WHERE si elle est vraie ...

0

Avez-vous l'indexation sur la table? Cela devrait aider la performance.

+0

Oui, mais SQL Server l'utilise uniquement lorsque j'utilise la deuxième instruction. Lorsque j'utilise mon premier stamtement avec le "filtre", le serveur effectue un index scan. – Torben

0

Il n'y a pas de "taille unique" approche d'interrogation pour cela, il y a des implications subtiles de performance dans la façon dont vous le faites. Si vous souhaitez aller au-delà de la simple réponse à la requête, quelle que soit sa lenteur, regardez cet article sur Dynamic Search Conditions in T-SQLby Erland Sommarskog