【发布时间】:2017-02-17 19:14:30
【问题描述】:
我使用 SQL Server 2012。我有一个名为“Table1”的示例表,包含七列。
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'
如何在不使用 sp_executesql(动态查询)的情况下实现这一目标?
【问题讨论】:
标签: stored-procedures sql-server-2012 sql-order-by