Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql T-SQL:orderby';表达式';_Tsql_Sorting_Dynamic Sql - Fatal编程技术网

Tsql T-SQL:orderby';表达式';

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 + @

所有将数据返回到我当前开发的Web服务表示层的存储过程都将两个整数作为参数,
@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上,然后按新列排序。