[SGBD] select * from matable order by @var

select * from matable order by @var [SGBD] - SQL/NoSQL - Programmation

Marsh Posté le 01-03-2005 à 12:22:31    

Bonjour,
 
Je suis sous SQL Server 2000.
 
J'ai tenté de faire ce script :
 

Code :
  1. declare @test int
  2. set @test = 2
  3. select orgid, type, subtype
  4. from organization
  5. order by orgid, @test


 
J'obtiens cette erreur :
 

Citation :

Serveur : Msg 1008, Niveau 15, État 1, Ligne 6
L'élément SELECT identifié par le n° ORDER BY 2 contient une variable faisant partie de l'expression identifiant une position de colonne. Les variables ne sont utilisées dans ORDER BY que si l'ordre est une expression référençant un nom de colonne.


 
J'ai donc changé en :

Code :
  1. declare @test varchar(255)
  2. set @test = 'type'
  3. select orgid, type, subtype
  4. from organization
  5. order by orgid, @test


 
J'obtiens toujours la même erreur.
 
Vous avez une idée pour résoudre cette erreur ? Je ne comprends pas du tout le sens du message en fait. A priori, j'ai le droit d'utiliser une variable, mais je ne comprend pas de quel cas :??:

Reply

Marsh Posté le 01-03-2005 à 12:22:31   

Reply

Marsh Posté le 01-03-2005 à 13:41:38    

Type c pas un mot réservé ?

Reply

Marsh Posté le 01-03-2005 à 14:07:01    

non non, avec "orgid" ça merde aussi de la même façon

Reply

Marsh Posté le 01-03-2005 à 14:16:00    

bon, c'est crade mais ça marche (c'est déjà ça)
 

Code :
  1. declare @test varchar(255)
  2. set @test = 'orgid'
  3. select orgid, type, subtype, toto = case @test when 'orgid' then right('0000000000' + cast(orgid as varchar(255)), 10) when 'type' then type when 'subtype' then subtype end
  4. from organization
  5. order by toto

Reply

Marsh Posté le 02-03-2005 à 22:41:51    

Je connais ce genre de pb, mais plutôt sur le 'TOP xxx'
Il faut passer toute ta requête en chaîne, et ensuite 'exécuter' cette chaîne.
Je n'ai pas la syntaxe sous la main pour le moment, j'ai çà au taf, mais là je suis en week end :D

Reply

Marsh Posté le 04-03-2005 à 16:35:22    

Bon, ben je vais chercher un moyen pour rien foutre jusqu'à ce soir et comme ça je pourrai attendre jusqu'à lundi pour avoir une meilleur solution que la mienne :)

Reply

Marsh Posté le 04-03-2005 à 17:02:49    

C'est relou ce truc...
 

Code :
  1. select case 2 when 1 then 1 when 2 then 2 end


=> Retourne "2" (logique)
 

Code :
  1. select orgid, count(assetid) toto
  2. from asset
  3. group by orgid
  4. union
  5. select 999, count(assetid) toto
  6. from asset
  7. order by 2


Retourne un jeu de résultat trié selon la deuxième colonne (logique)
 

Code :
  1. select orgid, count(assetid) toto
  2. from asset
  3. group by orgid
  4. union
  5. select 999 orgid, count(assetid) toto
  6. from asset
  7. order by case 2 when 1 then 1 when 2 then 2 end


Marche pas :cry:
 
Le pire, c'est l'erreur :

Serveur : Msg 104, Niveau 15, État 1, Ligne 1
Si l'instruction contient un opérateur UNION, les éléments ORDER BY doivent figurer dans la liste de sélection.


Truc qui n'a rien à voir, d'autant plus que ma variable n'est pas nommée !
 
Et... Histoire de bien rigoler...

Code :
  1. select orgid, count(assetid) toto
  2. from asset
  3. group by orgid
  4. order by case 2 when 1 then 1 when 2 then 2 end


Retourne le résultat trié par la seconde colonne !!!!!!!!!
 
Vin Dieu que c'est chiant ce truc :o
 
 
:heink:
 
Et maintenant :

Code :
  1. select tt, toto
  2. from (
  3. select 999 tt, count(assetid) toto
  4. from asset
  5. union
  6. select orgid tt, count(assetid) toto
  7. from asset
  8. group by orgid
  9. ) tmp
  10. order by case 2 when 1 then tt when 2 then toto end


 
Ca marche !!!!!!
 
Bon, vais boire un café, me pendre et chais pas quoi d'autre encore.


Message édité par Arjuna le 04-03-2005 à 17:07:06
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed