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)