2009-04-15 9 views
3

J'essaie d'utiliser un ordre dynamique dans une procédure stockée afin que je puisse transmettre l'ordre dans lequel je veux que les données renvoyées dans la procédure stockée soient un paramètre. Cela fonctionne bien pour les champs VARCHAR si je tente de trier un champ int ou datetime il des erreurs le code est à moi est comme suitSQL Server Dynamic Order By

DECLARE @ORDERBY INT 
SET @ORDERBY = 1 
SELECT TOP 10 * FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT 
ORDER BY 
CASE 
    WHEN @OrderBy = 1 THEN s10_record_dow 
    --WHEN @OrderBy = 2 THEN pk_big_record_id 
    else s10_record_dow 
END 

Si je décommenter la deuxième QUAND dans les erreurs de déclaration de cas de elle avec

"Erreur lors de la conversion du type de données varchar en bigint."

Je peux commander par ce champ très bien si je n'utilise pas l'instruction case.

Des idées?

Répondre

8

Modifier à ceci:

SELECT TOP 10 * FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT 
ORDER BY 
    CASE WHEN @OrderBy = 1 THEN s10_record_dow ELSE NUll END, 
    CASE WHEN @OrderBy = 2 THEN pk_big_record_id ELSE NULL END, 
    CASE WHEN @OrderBy <> 1 AND @OrderBy <> 2 THEN s10_record_dow 
     ELSE NULL 
    END 
+0

Merci qui semble fonctionner, par intérêt pourquoi était-il fonctionnait bien comment je l'avais avec VARCHAR mais pour utiliser INT ou d'autres types de données que j'ai l'avoir comme ça? – Gavin

+1

Tous les champs du cas doivent être évalués au même type de données. Mais, si tous les champs de votre liste peuvent être convertis en un seul type de données, vous devriez pouvoir utiliser une seule instruction Case ... si vous Cast les colonnes de données à ce type de données à l'intérieur de l'affaire –

3

Pourquoi ne pas utiliser ROW_NUMBER()?

SELECT TOP 10 
     *, 
     CASE @SortBy 
     WHEN 'A' THEN ROW_NUMBER() OVER (ORDER BY s10_record_dow) 
     WHEN 'B' THEN ROW_NUMBER() OVER (ORDER BY pk_id) 
     END RowNumber 
FROM TBL_LMS_USERS_RECORDs_LAST_ATTEMPT 

Ensuite, les colonnes que vous commandez peuvent être de n'importe quel type.

0
order by 
(case when (@orderByAsc = 1) then r.SomeColumn end) asc, 
(case when (@orderByAsc = 0) then r.SomeColumn end) desc 

Voici comment vous obtenez ascening ou descening

Questions connexes