split et jointure ? [SQLSERVER] - SQL/NoSQL - Programmation
Marsh Posté le 17-08-2010 à 12:19:08
ben c'est pas compliqué, tu l'appelles comme n'importe quelle fonction standard de SQL Server en lui fournissant 2 paramètres : le séparateur (char(1)) et la chaine de caractères <= 1024 caractères (varchar(1024))
Marsh Posté le 17-08-2010 à 14:58:21
certes. Mais comment tu fais l'appel ?
Ca me dit: Cannot find either column "dbo" or the user-defined function or aggregate "dbo.fn_split", or the name is ambiguous.
Marsh Posté le 17-08-2010 à 15:24:29
Code :
|
Marsh Posté le 17-08-2010 à 16:16:32
ça ne marche pas
j'ai même tenté de préfixer le nom avec [NOMDB].[dbo].fn_split()
et ça veut pas
Marsh Posté le 17-08-2010 à 16:31:35
ha ça ne marche pas parce que je le mettais dans le select, pas dans le from
mais alors, du coup comment je fais ma jointure
Marsh Posté le 17-08-2010 à 16:55:01
j'ai trouvé ça
Code :
|
Ca marche mais je ne comprends absolument rien
Et un SELECT TOP 1 * met 5 secondes à s'exécuter
Marsh Posté le 17-08-2010 à 18:24:54
Bon, je me suis fait une fonction scalar. Y en a pleins sur le net.
Code :
|
Soucis, ça ne marche pas non plus dans un select (??)
On fait comment alors ?
Quel casse tête ce truc
Marsh Posté le 18-08-2010 à 07:56:50
Ca marche tres bien quand c'est correctement utilisé
Tu peux nous donner l'exemple que tu es en train d'essayer?
C'est peut etre juste un détail qui bloque.
Maintenant coté perf ce sera toujours horrible, ce que tu essayes de faire fonctionnera toujours en row by row (tres tres lent).
L'ideal est de normaliser un peu la db et de ne plus avoir plusieurs colonnes en une.
Marsh Posté le 18-08-2010 à 10:21:55
Bon j'ai redémarré le SQL studio et ça marche
Je me retrouve avec un truc comme ça:
Code :
|
Maintenant je ne veux pas les id mais les valeurs associées qui sont dans une autre table.
Comment je fais ma jointure ?
Marsh Posté le 18-08-2010 à 10:46:38
Bon alors,
de mon esprit démoniaque est sorti ceci:
Je passe de ça: (pour avoir les ids)
Code :
|
à ça: (pour avoir les valeurs)
Code :
|
C'est correct ou y a mieux à faire ?
Marsh Posté le 18-08-2010 à 13:08:19
A vue de nez (j'ai verifié que la syntax) ca devrai aussi marcher comme ca:
Code :
|
Maintenant je me demande si la solution avec la table valued function était pas mieux point de vue performance, ici tu vas lire le record 6x (6x split) alors qu'avec la table valued function tu ne le lis qu'une seule fois.
Idéalement tu devrais avoir 6 colonnes en plus avec le contenu déja splité (soit tu le remplis a l'insert ou au pire tu rajoutes un trigger on insert/update qui met a jour les 6 colonnes).
Marsh Posté le 18-08-2010 à 13:57:20
Ça marche oui
Je ne peux pas modifier la table donc je suis obligé de faire le split moi-même.
la table valued tu veux dire un split qui me retourne une table et non un varchar ? Ca me pose problème aussi de faire 6 fois un split sur le même champ. Je vais voir ce que je peux faire
Marsh Posté le 18-08-2010 à 14:50:30
J'ai une fonction split qui donne une table comme ça:
select * from dbo.fn_split(';','10;20;30;40;50;60') v
value c
---------
10 1
20 2
30 3
40 4
50 5
60 6
y a moyen (pivot ?) de la transformer comme ça ? :
c1 c2 c3 c4 c5 c6
------------------
10 20 30 40 50 60
Marsh Posté le 18-08-2010 à 14:59:59
Oui le pivot te fera exactement ca.
Si ca peu attendre demain je pourrais te donner un exmemple, sinon les exemples dans les books online ne sont pas trop mal.
Marsh Posté le 18-08-2010 à 15:49:21
bon alors le pivot ça se passe comme ça:
Code :
|
et maintenant faut que je foute ça dans ma grosse query avec des join partout
Marsh Posté le 19-08-2010 à 12:50:48
Bon j'abandonne l'idée de faire un spilt en une fois c'est vraiment trop le bordel.
Par contre ma fonction split ne marche pas. Elle ne donne pas le dernier élément
Donc j'en ai fait une moi-même.
Pour ceux que ça intéresse:
Code :
|
Marsh Posté le 17-08-2010 à 11:36:52
Bonjour,
j'ai dans une table une colonne qui représente des valeurs séparées par des ";"
du style : 3000;10;4000;30;6000;60
3000 4000 et 6000 représentent des ids (de catégories) dans une autre table.
Il faudrait que je puisse spliter ces ids, les remplacer par le nom de leur catégorie et les mettre dans 3 colonnes.
Est-ce possible ?
A noter que j'ai trouver une fonction dbo.fn_split qui fait ceci:
mais je ne sais pas comment l'utiliser