将数据返回到我当前正在开发的Web服务的表示层的所有存储过程都将参数作为参数两个整数@StartingRow
和@MaximumRows
,这样我就可以在不检索整个结果列表的情况下对结果进行分页每次。现在我想在这些过程中引入排序,但是从我看到的每个人都使用动态SQL来进行排序:
EXEC ( 'WITH [Results] AS
( SELECT * ,
ROW_NUMBER() OVER ( ORDER BY ' + @SortExpression + @Direction + ') AS 'RowNumber'
FROM [SomeTable] )
SELECT [Column1] , [Column2]
WHERE ( [RowNumber] BETWEEN ' + @StartingRow +
' AND ( ' + @StartingRow + ' + ' + @MaximumRows + ' - 1) )' )
这种方法的问题在于,由于客户的需求,我无法使用动态SQL,因此我无法根据结果进行排序来指定列。那么我有什么选择呢?
答案 0 :(得分:2)
您可以使用case
。当Col1
等于1时,此示例在@SortParameter
上排序。对于参数5,它按Col2
降序排序。
order by
case
when @SortParameter = 1 then Col1
when @SortParameter = 2 then Col2
...
end
, case
when @SortParameter = 4 then Col1
when @SortParameter = 5 then Col2
...
end DESC
SQL Server无法使用此方法使用索引。这是使用动态SQL的主要原因。