В SQL Server 2005+ вы можете использовать следующее устройство:
WITH CustomerCTE AS (
SELECT
*,
DateSort = ROW_NUMBER() OVER (ORDER BY Date),
NameSort = ROW_NUMBER() OVER (ORDER BY Name)
FROM Customer
)
SELECT *
FROM CustomerCTE
ORDER BY DateSort * @DateSortDir, NameSort * @NameSortDir
В этом случае переменные должны быть либо 1
, либо -1
.
РЕДАКТИРОВАТЬ
В дополнительном опубликованном примере, по-видимому, подразумевается, что порядок использования столбцов в ORDER BY также должен быть динамическим.И теперь также кажется, что направление заказа указано одинаково для обоих столбцов.
Независимо от того, так это или нет (вопрос стал немного более неоднозначным), оба предполагаются в моем втором решении.
DECLARE @IntSortDir int;
SET @IntSortDir = CASE @directionOfSort WHEN 'A' THEN 1 ELSE -1 END;
WITH CustomerCTE AS (
SELECT
Customer_ID,
Name,
Age,
NameSort = ROW_NUMBER() OVER (ORDER BY Name),
AgeSort = ROW_NUMBER() OVER (ORDER BY Date)
FROM Customer
)
SELECT
Customer_ID,
Name,
Age
FROM CustomerCTE
ORDER BY
CASE @fieldSort WHEN 'Age' THEN AgeSort END * @IntSortDir,
NameSort * @directionOfSort,
CASE @fieldSort WHEN 'Name' THEN AgeSort END * @IntSortDir
@fieldSort
указывает столбец первичного заказа.Другой автоматически становится второстепенным.