OVH Cloud OVH Cloud

Order By dynamique sur colonnes de types différents

8 réponses
Avatar
Etienne
Bonjour,

j'ai un petit soucis avec le tri dans une requ=EAte. c'est=20
simple, j'ai un datagrid avec des colonnes date, texte,=20
entier. Je s=E9lectionne la colonne =E0 trier dans une liste=20
et j'ex=E9cute la requ=EAte en triant par la colonne choisie.

Mais vu que ma variable @OrderId (valeur de la liste)=20
correspond =E0 une colonne de type diff=E9rent, la requ=EAte ne=20
passe pas apparemment. Je fais :=20
select ColName, ColDate, ColSize from MaTable
Order by case @OrderId when 1 then ColName when 2 then=20
ColDate else ColSize end.

Ca SQL Server, il aime pas du tout !
Avez vous une id=E9e svp. Merci.

8 réponses

Avatar
Philippe T [MS]
Bonjour,

A moins soit d'un test du type "if then" dans une proc stock soit d'une
procédure texte exécuté avec sp_executesql dans lequel on ajoute le order by
nécessaire, je ne vois pas.

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"Etienne" wrote in message
news:00b201c4e459$08633c40$
Bonjour,

j'ai un petit soucis avec le tri dans une requête. c'est
simple, j'ai un datagrid avec des colonnes date, texte,
entier. Je sélectionne la colonne à trier dans une liste
et j'exécute la requête en triant par la colonne choisie.

Mais vu que ma variable @OrderId (valeur de la liste)
correspond à une colonne de type différent, la requête ne
passe pas apparemment. Je fais :
select ColName, ColDate, ColSize from MaTable
Order by case @OrderId when 1 then ColName when 2 then
ColDate else ColSize end.

Ca SQL Server, il aime pas du tout !
Avez vous une idée svp. Merci.
Avatar
Etienne
Sniff, je vais faire un exec du texte alors...
Merci.
-----Message d'origine-----
Bonjour,

A moins soit d'un test du type "if then" dans une proc


stock soit d'une
procédure texte exécuté avec sp_executesql dans lequel on


ajoute le order by
nécessaire, je ne vois pas.

Phil.
________________________________________________________
Philippe TROTIN


http://blogs.msdn.com/ptrotin
Microsoft Services France


http://www.microsoft.com/france

"Etienne" wrote in


message
news:00b201c4e459$08633c40$
Bonjour,

j'ai un petit soucis avec le tri dans une requête. c'est
simple, j'ai un datagrid avec des colonnes date, texte,
entier. Je sélectionne la colonne à trier dans une liste
et j'exécute la requête en triant par la colonne choisie.

Mais vu que ma variable @OrderId (valeur de la liste)
correspond à une colonne de type différent, la requête ne
passe pas apparemment. Je fais :
select ColName, ColDate, ColSize from MaTable
Order by case @OrderId when 1 then ColName when 2 then
ColDate else ColSize end.

Ca SQL Server, il aime pas du tout !
Avez vous une idée svp. Merci.


.



Avatar
Philippe T [MS]
Je compatis à votre douleur !!! :-)

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"Etienne" wrote in message
news:156301c4e509$2f748bd0$
Sniff, je vais faire un exec du texte alors...
Merci.
-----Message d'origine-----
Bonjour,

A moins soit d'un test du type "if then" dans une proc


stock soit d'une
procédure texte exécuté avec sp_executesql dans lequel on


ajoute le order by
nécessaire, je ne vois pas.

Phil.
________________________________________________________
Philippe TROTIN


http://blogs.msdn.com/ptrotin
Microsoft Services France


http://www.microsoft.com/france

"Etienne" wrote in


message
news:00b201c4e459$08633c40$
Bonjour,

j'ai un petit soucis avec le tri dans une requête. c'est
simple, j'ai un datagrid avec des colonnes date, texte,
entier. Je sélectionne la colonne à trier dans une liste
et j'exécute la requête en triant par la colonne choisie.

Mais vu que ma variable @OrderId (valeur de la liste)
correspond à une colonne de type différent, la requête ne
passe pas apparemment. Je fais :
select ColName, ColDate, ColSize from MaTable
Order by case @OrderId when 1 then ColName when 2 then
ColDate else ColSize end.

Ca SQL Server, il aime pas du tout !
Avez vous une idée svp. Merci.


.



Avatar
Sylvain Lafontaine
Solution facile: utilisez un case pour chaque colonne:

Order by Case @OrderId when 1 then ColName else 0 end,
Case @OrderId when 2 then ColDate else 0 end,
Case @OrderId when 3 then ColSize else 0 end

Vous pouvez également choisir de tout forger (caster) vers des chaînes de
caractère.

S. L.

"Etienne" wrote in message
news:00b201c4e459$08633c40$
Bonjour,

j'ai un petit soucis avec le tri dans une requête. c'est
simple, j'ai un datagrid avec des colonnes date, texte,
entier. Je sélectionne la colonne à trier dans une liste
et j'exécute la requête en triant par la colonne choisie.

Mais vu que ma variable @OrderId (valeur de la liste)
correspond à une colonne de type différent, la requête ne
passe pas apparemment. Je fais :
select ColName, ColDate, ColSize from MaTable
Order by case @OrderId when 1 then ColName when 2 then
ColDate else ColSize end.

Ca SQL Server, il aime pas du tout !
Avez vous une idée svp. Merci.
Avatar
Philippe T [MS]
Bonjour,

Pas mal, je ne connaissai pas cette astuce.

Merci de l'info je pense que cela va me servir.

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"Sylvain Lafontaine" <sylvain aei ca (fill the blanks, no spam please)>
wrote in message news:
Solution facile: utilisez un case pour chaque colonne:

Order by Case @OrderId when 1 then ColName else 0 end,
Case @OrderId when 2 then ColDate else 0 end,
Case @OrderId when 3 then ColSize else 0 end

Vous pouvez également choisir de tout forger (caster) vers des chaînes de
caractère.

S. L.

"Etienne" wrote in message
news:00b201c4e459$08633c40$
Bonjour,

j'ai un petit soucis avec le tri dans une requête. c'est
simple, j'ai un datagrid avec des colonnes date, texte,
entier. Je sélectionne la colonne à trier dans une liste
et j'exécute la requête en triant par la colonne choisie.

Mais vu que ma variable @OrderId (valeur de la liste)
correspond à une colonne de type différent, la requête ne
passe pas apparemment. Je fais :
select ColName, ColDate, ColSize from MaTable
Order by case @OrderId when 1 then ColName when 2 then
ColDate else ColSize end.

Ca SQL Server, il aime pas du tout !
Avez vous une idée svp. Merci.




Avatar
Etienne
J'ai essayé cette méthode et j'obtiens la même erreur que
pour de la méthode de mon post. Ais-je oublié quelque
chose ? pouvez vous me confirmez que cette méthode est
viable ?
Le cast en nvarchar de chaque champ fonctionne mais c'est
pas optimum puisque '11' est trié avant '2' par exemple.


-----Message d'origine-----
Solution facile: utilisez un case pour chaque colonne:

Order by Case @OrderId when 1 then ColName else 0 end,
Case @OrderId when 2 then ColDate else 0 end,
Case @OrderId when 3 then ColSize else 0 end

Vous pouvez également choisir de tout forger (caster)


vers des chaînes de
caractère.

S. L.

"Etienne" wrote in


message
news:00b201c4e459$08633c40$
Bonjour,

j'ai un petit soucis avec le tri dans une requête. c'est
simple, j'ai un datagrid avec des colonnes date, texte,
entier. Je sélectionne la colonne à trier dans une liste
et j'exécute la requête en triant par la colonne choisie.

Mais vu que ma variable @OrderId (valeur de la liste)
correspond à une colonne de type différent, la requête ne
passe pas apparemment. Je fais :
select ColName, ColDate, ColSize from MaTable
Order by case @OrderId when 1 then ColName when 2 then
ColDate else ColSize end.

Ca SQL Server, il aime pas du tout !
Avez vous une idée svp. Merci.


.



Avatar
Sylvain Lafontaine
Cette méthode est bonne mais évidemment, il faut utiliser autre chose que 0
pour les types de donnée autres que numérique, comme par exemple '' pour les
strings ou encore la valeur null. De plus, la valeur utilisée n'a pas
vraiment d'importance, il suffit qu'elle soit la même pour toutes les
rangées, de ne façon à ne pas influencer l'ordre de tri lorsque l'on ne veut
pas.

Personnellement, j'utilise la syntaxe suivante pour le Case mais cela ne
devrait rien changer:

... Case When @CheckTriLigue = -1 Then L.Nom Else Null End ...

Pour la conversion sous la forme de nvarchar, il faut évidemment s'arranger
pour avoir "02" au lieu de "2".

S. L.

"Etienne" wrote in message
news:086501c4e625$4d5d8710$
J'ai essayé cette méthode et j'obtiens la même erreur que
pour de la méthode de mon post. Ais-je oublié quelque
chose ? pouvez vous me confirmez que cette méthode est
viable ?
Le cast en nvarchar de chaque champ fonctionne mais c'est
pas optimum puisque '11' est trié avant '2' par exemple.


-----Message d'origine-----
Solution facile: utilisez un case pour chaque colonne:

Order by Case @OrderId when 1 then ColName else 0 end,
Case @OrderId when 2 then ColDate else 0 end,
Case @OrderId when 3 then ColSize else 0 end

Vous pouvez également choisir de tout forger (caster)


vers des chaînes de
caractère.

S. L.

"Etienne" wrote in


message
news:00b201c4e459$08633c40$
Bonjour,

j'ai un petit soucis avec le tri dans une requête. c'est
simple, j'ai un datagrid avec des colonnes date, texte,
entier. Je sélectionne la colonne à trier dans une liste
et j'exécute la requête en triant par la colonne choisie.

Mais vu que ma variable @OrderId (valeur de la liste)
correspond à une colonne de type différent, la requête ne
passe pas apparemment. Je fais :
select ColName, ColDate, ColSize from MaTable
Order by case @OrderId when 1 then ColName when 2 then
ColDate else ColSize end.

Ca SQL Server, il aime pas du tout !
Avez vous une idée svp. Merci.


.



Avatar
Etienne
Merci bcp pour ces infos intéressantes. Ca va bien
m'aider.
Sinon pour le cast d'un nombre, il est toujours possible
de mentionner @Order = cast(len(MonNombre) as nvarchar) +
cast(MonNombre as nvarchar) et ça tri bien.

-----Message d'origine-----
Cette méthode est bonne mais évidemment, il faut


utiliser autre chose que 0
pour les types de donnée autres que numérique, comme par


exemple '' pour les
strings ou encore la valeur null. De plus, la valeur


utilisée n'a pas
vraiment d'importance, il suffit qu'elle soit la même


pour toutes les
rangées, de ne façon à ne pas influencer l'ordre de tri


lorsque l'on ne veut
pas.

Personnellement, j'utilise la syntaxe suivante pour le


Case mais cela ne
devrait rien changer:

.... Case When @CheckTriLigue = -1 Then L.Nom Else Null


End ...

Pour la conversion sous la forme de nvarchar, il faut


évidemment s'arranger
pour avoir "02" au lieu de "2".

S. L.

"Etienne" wrote in


message
news:086501c4e625$4d5d8710$
J'ai essayé cette méthode et j'obtiens la même erreur que
pour de la méthode de mon post. Ais-je oublié quelque
chose ? pouvez vous me confirmez que cette méthode est
viable ?
Le cast en nvarchar de chaque champ fonctionne mais c'est
pas optimum puisque '11' est trié avant '2' par exemple.


-----Message d'origine-----
Solution facile: utilisez un case pour chaque colonne:

Order by Case @OrderId when 1 then ColName else 0 end,
Case @OrderId when 2 then ColDate else 0 end,
Case @OrderId when 3 then ColSize else 0 end

Vous pouvez également choisir de tout forger (caster)


vers des chaînes de
caractère.

S. L.

"Etienne" wrote in


message
news:00b201c4e459$08633c40$
Bonjour,

j'ai un petit soucis avec le tri dans une requête. c'est
simple, j'ai un datagrid avec des colonnes date, texte,
entier. Je sélectionne la colonne à trier dans une liste
et j'exécute la requête en triant par la colonne




choisie.

Mais vu que ma variable @OrderId (valeur de la liste)
correspond à une colonne de type différent, la requête




ne
passe pas apparemment. Je fais :
select ColName, ColDate, ColSize from MaTable
Order by case @OrderId when 1 then ColName when 2 then
ColDate else ColSize end.

Ca SQL Server, il aime pas du tout !
Avez vous une idée svp. Merci.


.





.