我使用SQL Server 2012.我有一个名为“Table1”的示例表,其中有七列。SQL Server中多列的动态顺序
CREATE TABLE TABLE1
(
Field1 INT ,
Field2 INT ,
Field3 INT ,
Field4 INT ,
Field5 INT ,
Field6 INT ,
Field7 INT
)
GO
INSERT INTO TABLE1 VALUES (1,2,9,5,1,5,85)
INSERT INTO TABLE1 VALUES (2,6,8,4,1,4,45)
INSERT INTO TABLE1 VALUES (3,5,7,3,5,6,1)
INSERT INTO TABLE1 VALUES (4,4,6,1,51,4,1)
INSERT INTO TABLE1 VALUES (5,5,5,4,7,2,7)
INSERT INTO TABLE1 VALUES (6,5,4,6,4,7,8)
INSERT INTO TABLE1 VALUES (7,12,5,3,2,5,3)
INSERT INTO TABLE1 VALUES (8,1,6,5,9,5,1)
INSERT INTO TABLE1 VALUES (9,1,13,2,1,7,3)
INSERT INTO TABLE1 VALUES (10,6,9,3,6,2,6)
INSERT INTO TABLE1 VALUES (11,2,1,2,8,7,7)
INSERT INTO TABLE1 VALUES (12,7,6,1,3,3,2)
INSERT INTO TABLE1 VALUES (13,7,2,6,4,7,1)
GO
我创建了以下存储过程,这个SP能够查询考虑通过列问道订单数据。 我可以通过(ASC或Desc)查询每个列的可能性和顺序。
CREATE Procedure ProceName
(
@OrderByField INT = 1,
@OrderDirection INT = 0 -- 0 = Asc , 1 = Desc
)
As
Begin
SELECT
*
FROM Table1
ORDER BY
CASE WHEN @OrderDirection=0 AND @OrderByField=1 THEN Field1 END ASC,
CASE WHEN @OrderDirection=0 AND @OrderByField=2 THEN Field2 END ASC,
CASE WHEN @OrderDirection=0 AND @OrderByField=3 THEN Field3 END ASC,
CASE WHEN @OrderDirection=0 AND @OrderByField=4 THEN Field4 END ASC,
CASE WHEN @OrderDirection=0 AND @OrderByField=5 THEN Field5 END ASC,
CASE WHEN @OrderDirection=0 AND @OrderByField=6 THEN Field6 END ASC,
CASE WHEN @OrderDirection=0 AND @OrderByField=7 THEN Field7 END ASC,
CASE WHEN @OrderDirection=1 AND @OrderByField=1 THEN Field1 END DESC,
CASE WHEN @OrderDirection=1 AND @OrderByField=2 THEN Field2 END DESC,
CASE WHEN @OrderDirection=1 AND @OrderByField=3 THEN Field3 END DESC,
CASE WHEN @OrderDirection=1 AND @OrderByField=4 THEN Field4 END DESC,
CASE WHEN @OrderDirection=1 AND @OrderByField=5 THEN Field5 END DESC,
CASE WHEN @OrderDirection=1 AND @OrderByField=6 THEN Field6 END DESC,
CASE WHEN @OrderDirection=1 AND @OrderByField=7 THEN Field7 END DESC End
GO
EXECUTE ProceName @OrderByField=1, @OrderDirection=0
EXECUTE ProceName @OrderByField=6, @OrderDirection=1
现在我需要改变这个SP通过一系列列接受多列的顺序。他们可以通过名字或列的顺序。 在这种情况下,我应该能够执行我的SP类似下面的命令:
EXECUTE ProceName @OrderByField='6,7,2', @OrderDirection='0,1,1'
我怎样才能实现这一目标GOOL 使用该sp_executesql的(动态查询)了呢?
https://sqlperformance.com/2012/08/t-sql-queries/conditional-order-by和https://blogs.sentryone.com/aaronbertrand/sql-variant-use -case/ –