У меня есть хранимая процедура, которая возвращает результаты, отсортированные динамически.Родительская папка (это для управления контентом) имеет поле RankTypeID, которое позволяет сортировать по рангу (0), дате начала в порядке возрастания (1), дате начала в порядке убывания (2) и заголовку документа (3)
Ранг - целое число, дата - smalldatetime, а заголовок - nvarchar.
...
ORDER BY
Case Parent.RankTypeID
When 0 Then dbo.Folders.Rank
When 1 Then Cast(dbo.Documents.SortableDateStart As bigint)
When 2 Then (1 - Cast(dbo.Documents.SortableDateStart As bigint))
When 3 Then Cast(dbo.Documents.Title as sql_variant)
End
Я настроил SortableDateStart как вычисляемый столбец, чтобы использовать DateStart smalldatetimeстолбец и преобразовать его в bigit для сортировки.Он принимает дату ISO8601 (разработана для использования в формате xml, а также удобна для сортировки) и заменяет символы T,: и -
(replace(replace(replace(CONVERT([varchar](16),[DateStart],(126)),'T',''),'-',''),':',''))
Это довольно уродливо.Есть лучший способ сделать это?Я также открыт для более эффективных способов обработки этой динамической сортировки.
Редактировать: Настройка данных теста
DECLARE @Temp TABLE
(
[Rank] int,
[Title] nvarchar(100),
[DateStart] datetime
)
INSERT into @Temp
SELECT 1, 'title1', '1/1/2010 10:01:00AM'
UNION
SELECT 2, 'atitle1', '1/1/2010 10:03:00AM'
UNION
SELECT 3, 'title1', '1/1/2010 10:10:00AM'
UNION
SELECT 4, 'btitle1', '1/1/2010 10:04:00AM'
UNION
SELECT 10, 'title1', '1/1/2010 10:07:00AM'
UNION
SELECT 11, 'dtitle1', '1/1/2010 10:09:00AM'
UNION
SELECT 12, 'ctitle1', '1/1/2010 10:00:01AM'
UNION
SELECT 13, 'title1', '1/1/2010 10:10:00AM'
DECLARE @RankTypeID tinyint
--SET @RankTypeID = 0 -- rank
--SET @RankTypeID = 1 -- date start asc
SET @RankTypeID = 2 -- date start desc
--SET @RankTypeID = 3 -- title
SELECT
[Rank],
[DateStart],
[Title]
FROM
@Temp
ORDER BY
Case @RankTypeID
When 0 Then [Rank]
When 1 Then Cast([DateStart] As sql_variant)
When 3 Then [Title]
else null
End,
Case @RankTypeID
When 2 Then Cast([DateStart] As sql_variant)
End DESC