Można sortować dynamicznie na wielu typach, wprowadzając multiplier hack do Order by
. Realizacja będzie zależeć to, że jesteś w stanie przekształcić każde pole sortable na pole całkowitą, tak:
DECLARE @Var1 NVARCHAR(20);
DECLARE @Var2 NVARCHAR(3);
DECLARE @OrderHack INT;
SET @Var1 = 'priority';
SET @Var2 = 'DESC';
IF (@Var2 = 'ASC')
SET @OrderHack = 1;
ELSE
SET @OrderHack = -1;
SELECT *
FROM SortTable
ORDER BY
CASE @var1
WHEN 'priority'
THEN CONVERT(INT, [priority]) * @OrderHack
WHEN 'report_date'
THEN CONVERT(INT, report_date) * @OrderHack
END;
SqlFiddle here
Edycja
Właśnie w celu wyjaśnienia, jak na @t-clausen.dk
„s punkcie , hack jest zależny od konwersji z powrotem na rosnący numeryczny typ reprezentujący kolejność. na przykład Jeśli wymagana jest wyższa rozdzielczość na DATETIME
, aby zapewnić uwzględnienie komponentu czasu, to INT @OrderHack
może być zastąpiony przez FLOAT
lub DECIMAL
itd. Zastrzeżenie: Użycie tej techniki do sortowania na kolumnach *CHAR
może być trudne, szczególnie w przypadku Uwzględniana jest czułość akcentu.
Czy chcesz korzystać z dynamicznego SQL? Jeśli nie, jedynym sposobem będzie posiadanie 4 przypadków w zamówieniu przez, jedną dla kolumny i jedną dla zamówienia. –
Zauważając, że kolumny sortowania OP nie wyglądają na * char - lepsze referencje dla możliwych duplikatów tutaj: http: //stackoverflow.com/questions/1147763/dynamic-order-direction i http://stackoverflow.com/questions/848340/malejąco-parametr-do-przechowywanej procedury – StuartLC