Bonjour,
Voilà, j'ai des enregistrements en base avec un champs prix1 et un champs prix2.
J'aimerais recevoir mes enregistrements et le MIN de prix1 et prix2 dans un champs.
Je ne vois pas trop comment faire cela.
Merci pour votre aide!
Bonjour,
Voilà, j'ai des enregistrements en base avec un champs prix1 et un champs prix2.
J'aimerais recevoir mes enregistrements et le MIN de prix1 et prix2 dans un champs.
Je ne vois pas trop comment faire cela.
Merci pour votre aide!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT CASE WHEN prix1 < prix2 THEN prix1 ELSE prix2 END AS PRIX_MIN FROM MaTable
Perso je l'ai fait dans une librairie C# pour SQL Server...
Niveau vitesse je sais pas trop, mais ça fait ce que ça doit.
C'est dommage de faire une librairie C# pour avoir un min de 2 valeurs en SQL. Cela oblige à faire un appel externe via une assembly SQL.
++
une simple UDF suffit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 ALTER FUNCTION dbo.F_MIN( @a FLOAT, @b FLOAT ) RETURNS FLOAT WITH SCHEMABINDING AS BEGIN RETURN CASE WHEN @a < @b THEN @a ELSE @b END END
Pour le moment...C'est claire, mais la on ne parle pas de performances.
Evitez ce genre de raisonnement vous allez vite vous faire taper dessus...
Bonjour,
C'est bien le problème de la grande majorité des entreprises qui négligent totalement la qualité de leur modèle et de leur données ... Ensuite il ne leur reste que leur porte-monnaie pour pleurer et recevoir un consultant comme un sauveur ... Consultants, vous avez de beaux jours devant vous !C'est claire, mais la on ne parle pas de performances.
D'autre part dans le cas présent, la simplicité du script de Babyneedle est bien plus élevée que de devoir écrire l'assembly, la déployer, et l'utiliser, et ce que l'on soit expérimenté en .NET ou pas.
Enfin je ne vois pas ce qui justifie une assembly ici : il n'y aucune itération ou calcul sur des chaînes de caractère par exemple ...
En conclusion, n'utilisez pas l'intégration CLR à toutes les sauces, mais seulement pour réaliser un besoin métier pour lequel le langage SQL n'est pas conçu, ou pour lequel l'implémentation en SQL est possible mais complexe. Dans toute tâche de développement, il est à mon humble avis requis de constamment garder à l'esprit les performances et la maintenabilité.
Ce que suggère aieeeuuuuu est sympa aussi, cela étant j'aurai plutôt écrit une fonction de table incluse, qui est appelée de façon ensembliste, et pas une fois par ligne du résultat comme les fonctions UDF scalaires :
@++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 USE maDB GO CREATE FUNCTION dbo.F_MIN ( @a int , @b int ) RETURNS TABLE AS RETURN SELECT CASE WHEN @a < @b THEN @a ELSE @b END AS min_val GO SELECT V.number , W.number , MV.min_val FROM master.dbo.spt_values AS V INNER JOIN master.dbo.spt_values AS W ON W.number = V.number - 1 CROSS APPLY dbo.F_MIN(V.number, W.number) AS MV WHERE V.type = 'P' AND W.type = 'P'![]()
Sauf quand la société en question est un éditeur de progiciel! Dans ce cas c'est lepigeonclient qui a acheté le progiciel qui dépense des mille et des cent en audits divers et variés pour demander les modifications nécessaires au bon fonctionnement du bouzin, modifications bien entendu payantes!![]()
Certes ...Sauf quand la société en question est un éditeur de progiciel! Dans ce cas c'est le pigeon client qui a acheté le progiciel qui dépense des mille et des cent en audits divers et variés pour demander les modifications nécessaires au bon fonctionnement du bouzin, modifications bien entendu payantes!
Encore lundi un audit chez un client possédant NAVISION (bon la version 5 ok...)
A 1250 euros TTC la journée...
Ceci étant dit c'est dommage qu'on est pas la requête Alexis35. Ca éviterait de faire des suppositions.
++
ça grouille de consultants ici dis donc
Bonjour,
Je comprends le critère de lisibilité, mais les plans de requête ne montrent pas les exécutions successives de fonctions, donc il est possible que l'on obtienne des plans d'exécutions identiques, bien que j'en doute car la méthode d'exécution est différente (cf plan de requête joint).Envoyé par aieeeuuuuu
D'autre part, la trace que j'ai prise et qui est en pièce jointe montre plusieurs appels à la fonction scalaire, mais un seul appel à la fonction de table incluse.
Le lot de requêtes que j'ai utilisé pour cela est :
@++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 CREATE FUNCTION dbo.F_MIN_INLINE ( @a int , @b int ) RETURNS TABLE AS RETURN SELECT CASE WHEN @a < @b THEN @a ELSE @b END AS min_val GO CREATE FUNCTION dbo.F_MIN_SCALAR ( @a int , @b int ) RETURNS int WITH SCHEMABINDING AS BEGIN RETURN CASE WHEN @a < @b THEN @a ELSE @b END END GO SET NOCOUNT ON SET STATISTICS TIME ON GO PRINT '-----------------------------------------' SELECT V.number , W.number , dbo.F_MIN_SCALAR(V.number, W.number) FROM master.dbo.spt_values AS V INNER JOIN master.dbo.spt_values AS W ON W.number = V.number - 1 WHERE V.type = 'P' AND W.type = 'P' PRINT '-----------------------------------------' SELECT V.number , W.number , MV.min_val FROM master.dbo.spt_values AS V INNER JOIN master.dbo.spt_values AS W ON W.number = V.number - 1 CROSS APPLY dbo.F_MIN_INLINE(V.number, W.number) AS MV WHERE V.type = 'P' AND W.type = 'P'![]()
Je n'ai pas pu ouvrir ta trace, mais je te crois sur parole
Et je reste d'accord avec toi sur le principe : préférons les fonction incluses au fonctions scalaires autant que faire ce peut...
Voire même : "évitons les fonctions scalaires"
Surtout quand je vois que pour une requête telle que celle-ci
La fonction scalaire, pourtant déterministe, est appelée... quatre fois
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT a , b , dbo.F_MIN_SCALAR(a,b) as mini1 , dbo.F_MIN_SCALAR(a,b) as mini2 FROM( VALUES (1,2), (1,2) )T(a,b)!
Moi non plus, la trace ne s'ouvre pas...
Envoyé par aieeeuuuuu
Dingue ça ... Je viens de l'ouvrir avec le Profiler de SQL Server 2012 ...Envoyé par iberserk
Est-ce que vous l'avez ouvert avec cette version aussi ?
Qu'est-ce que ça donne avec la capture d'écran en pièce jointe ?
Je suis totalement d'accordEnvoyé par aieeeuuuuu
Effectivement la requête que tu donnes est ... bizarre
@++![]()
Arrête !! dis plutôt que tu voulais nous fourguer un de ces virus de Thaïlande oui !!Dingue ça ... Je viens de l'ouvrir avec le Profiler de SQL Server 2012 ...
++
Bon, OK, j'avoue, j'ai reçu un peu de H7N9 de Chine ... T'en veux ?Envoyé par mikedavem
Cela étant je n'ai pas non plus un Enterprise Edition sur un 80 coresEnvoyé par aieeeuuuuu
La version développeur coûte 40€.
Trêve de plaisanteries, je marque le sujet comme résolu
@++![]()
Partager