Мы выполняем подобный вид динамического заказа в одном из наших продуктов.
Единственное, что реально отличается от вашего кода, во-первых, мы не используем live join.
Мы создаем временную таблицу, чтобы мы могли выполнить разбиение на страницы, а затем применить порядок.
Мы также используем целочисленные значения для упорядочения, сокращая накладные расходы при сравнении строк.
Это делает ваш SQL немного длиннее, но этот подход определенно быстрее для оптимизатора запросов. Кроме того, и что еще более важно, я не думаю, что вы можете смешивать типы в блоках Switch для упорядочения, поэтому, следуя исходному коду, вам придется конвертировать все ваши данные в одно и то же время, что побеждает объект: (
Так что у вас будет
DECLARE @temp TABLE(ID int identity(1,1), TemplateID int, TemplateName nvarchar(100), CreatedOn datetime, UploadedBy nvarchar(100))
INSERT INTO @temp(TemplateID, TemplateName, CreatedOn, UploadedBy)
SELECT TemplateID,
TemplateName,
CreatedOn,
( [user].LastName + ' ' + [user].FirstName ) AS UploadedBy
FROM Templates
INNER JOIN [user] ON [user].UserID = Templates.CreatedBy
WHERE facilityid = @facilityID
Тогда:
IF @SortOrder = 1 --'ASC'
BEGIN
IF @sort = 2
Select *
From @Temp
Order by TemplateName ASC
ELSE IF @sort = 3
Select *
From @Temp
Order By CreatedBy ASC
-- and so on...
END
ELSE -- descending
BEGIN
-- Ad. Inf.
END
Delete
From @Temp
WHERE ID < @pageStart or ID > @pageStart + @pageSize