Tsql T-SQL:orderby';表达式';
所有将数据返回到我当前开发的Web服务表示层的存储过程都将两个整数作为参数,Tsql T-SQL:orderby';表达式';,tsql,sorting,dynamic-sql,Tsql,Sorting,Dynamic Sql,所有将数据返回到我当前开发的Web服务表示层的存储过程都将两个整数作为参数,@StartingRow和@maximumrrows,这样我就可以对结果进行分页,而无需每次检索整个结果列表。现在我想在这些过程中介绍排序,但从我看到的情况来看,每个人都使用动态SQL进行排序: EXEC ( 'WITH [Results] AS ( SELECT * , ROW_NUMBER() OVER ( ORDER BY ' + @SortExpression + @
@StartingRow
和@maximumrrows
,这样我就可以对结果进行分页,而无需每次检索整个结果列表。现在我想在这些过程中介绍排序,但从我看到的情况来看,每个人都使用动态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,因此我无法指定结果排序所依据的列。那么,我有什么选择呢?您可以使用
案例。当@SortParameter
等于1时,此示例按Col1
排序。对于参数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的主要原因。更容易阅读,更容易帮助。重新格式化,以便我们无需滚动即可读取整个SQL语句。由于“客户需求”,您不能使用动态SQL吗?客户如何/为什么对您的实施提出要求?需求/规范永远不应该处于那个级别……可能客户不信任程序员以避免SQL注入的方式使用动态SQL。考虑到这里发布的动态SQL示例,这将是一个合理的要求,它允许通过参数注入恶意代码。。。如果col1是first_name,那么它将尝试按first_name(第一条记录的)的内容排序,例如我的姓:阿里扎。但之前,它试图转换为INT。。。它会产生一个混乱的“like”->orderbycast('ARIZA'作为INT)
,当将varchar值'ARIZA'转换为数据类型INT时,您将得到一个异常转换失败。
。解决此问题的选项是使用@SortParameter创建列。因此,CASE语句将位于SELECT上,然后按新列排序。