|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() Benoît Inscription : février 2003 Messages : 1 200 ![]() |
Bonjour,
Quelle technique opteriez vous quand vous avez 2 requetes quasi identique mais où la clause where à des paramètres en plus Exemple: SP1:et une autre SP2: Code :
SELECT * FROM Etudiant WHERE Nom=@Nom AND Prenom=@Prenom Vous pensez qu'il est mieux: -d'utiliser 2 procédures différentes -créer un if "select ... ELSE select ...."? -créer un string et utilisé "sp_executeSQL" -autre?
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes |
|
|
00
|
|
|
#2 |
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 773 ![]() |
Est-ce que dans tous les cas vous pouvez transmettre tous les paramètres, à NULL par exemple ?
Dans ce cas vous pourriez faire : Code :
SELECT * FROM Etudiant WHERE Nom=@Nom AND Prenom=COALESCE(@Prenom, Prenom) Je me demande si le moteur SQL détecte l'aberration de la clause et fait en sorte de ne pas perdre de temps... ?
__________________
Alexandre Chemla - Consultant MS BI chez Masao |
|
|
00
|
|
|
#3 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Le processeur de requêtes créera un plan de requêtes avec les paramètres de la première exécution de la procédure stockée. En conséquence, il faut mieux écrire un IF ... ELSE. Cependant, si vous avez de nombreux paramètres, il vaut mieux construire la chaîne de requête au fil de l'eau en testant le NULLité de la valeur des paramètres, puis soumettre la requête à l'aide de la procédure stockée sp_executesql, qui vous permettra à coup sûr d'avoir un plan par jeu de paramètres lorsque ceux-ci ne sont pas à NULL. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#4 |
|
Membre Expert
![]() Benoît Inscription : février 2003 Messages : 1 200 ![]() |
Dans ce cas si j'ai 4 paramètres (a,b,c,d) dont 2 peuvent être null (c,d)
donc j'ai : 2 valeurs (a,b), 2 null (c,d) 3 valeurs (a,b,c), 1 null (d) 3 valeurs (a,b,d), 1 null (c) 4 valeurs (a,b,c,d) quand j'ai la requête dans le code (.net) de mon programme j'ajoute à la requête mais vu qu'ici c'est une SP et vu qu'en SQL on ne peux pas faire mais par ca marche moins bien
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes |
|
|
00
|
|
|
#5 | |||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Il suffisait de faire ce que je vous ai suggéré
:Code :
Citation:
C'est pourquoi on utilise IS et par égale @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|||
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Benoît Inscription : février 2003 Messages : 1 200 ![]() |
Merci
![]() juste une petite correction Code :
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes |
||
|
|
00
|
|
|
#7 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Effectivement, merci de l'avoir relevé, et ravi de vous avoir aidé
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() Benoît Inscription : février 2003 Messages : 1 200 ![]() |
Une autre façon de faire est
Code :
ps: en relisant le post j'ai vu que j'avais zappé le message de Jinroh77 COALESCE c'est l'équivalent du IsNull mais sans le OR ( etudiant.c is null and @_c is null) les rows qui ont c à null ne seront pas renvoyés
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes |
||
|
|
00
|
|
|
#9 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Cela fonctionne effectivement, mais le filtre n'est pas cherchable.
En conséquence, à chaque fois que vous exécuterez la requête, elle lira toute la table. En revanche avec la solution que je vous propose, si les colonnes c et d sont supportées par un index, la requête sera plus performante. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#10 | |
|
Membre Expert
![]() Benoît Inscription : février 2003 Messages : 1 200 ![]() |
Citation:
![]() Je ne vois pas la différence
__________________
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes |
|
|
|
00
|
|
|
#11 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Parce que SQL Server maintient des statistiques sur les valeurs qui sont dans les colonnes, pas sur les valeurs des fonctions qu'on peut appliquer à une colonne.
De la même façon un prédicat OR n'est souvent pas cherchable : il est possible de dire, à partir des statistiques, si une colonne contient une valeur et (AND) une aussi, mais pas si une colonne contient une valeur ou (OR) une autre en contient une autre @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
Copyright © 2000-2012 - www.developpez.com