2009-04-15 13 views
3

Ich versuche, eine dynamische Reihenfolge in einer gespeicherten Prozedur zu verwenden, damit ich die Reihenfolge übergeben kann, die die Daten in der gespeicherten Prozedur als Parameter zurückgegeben werden soll. Dies funktioniert für VARCHAR Felder jedoch in Ordnung, wenn ich versuche, den Code ein int oder Datetime-Feld es Fehler zu sortieren I haben alsDynamische SQL Server-Reihenfolge von

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 

folgt Wenn ich die zweite, wenn sie im Fall Aussage es Fehler mit

Kommentar-

"Fehler beim Konvertieren des Datentyps varchar in bigint."

Ich kann durch dieses Feld gut bestellen, wenn ich die case-Anweisung nicht verwende.

Irgendwelche Ideen?

Antwort

8

ändern es dazu:

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

Dank, die aus Interesse scheint zu funktionieren, warum es ok funktioniert, wie ich es mit VARCHAR hatte aber um INT oder andere Datentypen zu verwenden, ich habe um es so zu haben? – Gavin

+1

Alle Felder im Fall müssen auf den gleichen Datentyp ausgewertet werden. Wenn jedoch alle Felder in Ihrer Liste in einen einzelnen Datentyp konvertiert werden können, sollten Sie in der Lage sein, eine einzelne Case-Anweisung zu verwenden, wenn Sie die Datenspalten umwandeln zu diesem Datentyp im Case –

3

Warum nicht 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 

Dann können die Spalten, die Sie bestellen, von beliebiger Art sein.

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

dies ist, wie Sie ascening erhalten oder descening