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
Sql server SQL Server在多个INT列上的动态排序_Sql Server_Sorting_Dynamic_Sql Order By - Fatal编程技术网

Sql server SQL Server在多个INT列上的动态排序

Sql server SQL Server在多个INT列上的动态排序,sql-server,sorting,dynamic,sql-order-by,Sql Server,Sorting,Dynamic,Sql Order By,使用使用参数确定排序的存储过程,我可以使用这种方法对多个字符串列进行排序: ROW_NUMBER() OVER ( ORDER BY -- string order by CASE @SortDirection WHEN 'ASC' THEN CASE @SortIndex WH

使用使用参数确定排序的存储过程,我可以使用这种方法对多个字符串列进行排序:

ROW_NUMBER() OVER
            (
            ORDER BY
            --  string order by
            CASE @SortDirection
                  WHEN 'ASC'  THEN
                    CASE @SortIndex
                      WHEN 1 THEN SKU
                      WHEN 2 THEN BrandName + ',' + ItemName 
                      WHEN 3 THEN ItemName
                    END            
                END ASC,
                CASE @SortDirection
                  WHEN 'DESC' THEN
                    CASE @SortIndex
                      WHEN 1 THEN SKU
                      WHEN 2 THEN BrandName + ',' + ItemName
                      WHEN 3 THEN ItemName
                    END
                END DESC
但是,如果我想按多于1个INT列排序,这种方法不起作用,可能是因为我将逗号连接为字符串,而case表达式需要INT数据类型(解释)

这给了我一个错误:

System.Data.SqlClient.SqlException: 
Conversion failed when converting the varchar value ',' to data type int
如果我将串联移动到处理字符串的case表达式,则排序将不起作用,因为值不再是int:

WHEN 5 THEN CAST(InStockLocal.Qty AS VARCHAR(10))  
       + ' ,' + CAST(AllStock.Qty AS VARCHAR(10))

如何绕过此问题?

我唯一能想到的解决方法是将其转换为varchar,然后通过添加前导零确保它们具有相同数量的字符:

WHEN 5 THEN RIGHT('0000000000' + CAST(InStockLocal.Qty AS VARCHAR(10)),10) 
+ RIGHT('0000000000' + CAST(AllStock.Qty AS VARCHAR(10)),10)
我假设10个字符是最大长度,因为这是您在示例中展示的

WHEN 5 THEN RIGHT('0000000000' + CAST(InStockLocal.Qty AS VARCHAR(10)),10) 
+ RIGHT('0000000000' + CAST(AllStock.Qty AS VARCHAR(10)),10)