以下查询是一个更大的复杂查询的原型 问题是我应该能够根据用户输入以任何顺序(即ASC和DESC)对任何列进行排序。
CREATE table #Table1(
Name varchar(10) PRIMARY key,
DOB DateTime,
Rate numeric(10,2)
)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name1','2/2/2012',10.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name2','3/2/2012',120.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name3','4/2/2012',110.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name4','5/2/2012',140.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name15','6/2/2012',130.23)
INSERT INTO #Table1 (Name,DOB,Rate) values ('Name6','2/21/2012',1120.23)
Declare @SortColumn varchar(10)
DECLARE @SortExpression varchar (10)
SET @SortColumn = 'DOB'
SET @SortExpression = 'DESC' -- Need to sort in both ASC and DESC
Select
Name,
DOB,
Rate,
ROW_NUMBER() OVER
(ORDER BY
CASE WHEN @SortColumn = 'Name' then Name
WHEN @SortColumn = 'DOB' THEN DOB
WHEN @SortColumn = 'Rate' THEN Rate
END + @SortExpression
) AS RowNumber
FROM
#Table1
答案 0 :(得分:2)
您似乎需要CAST()
和CONVERT()
CASE
中的项目才能让它发挥作用:
Declare @SortColumn varchar(10)
DECLARE @SortExpression varchar (10)
SET @SortColumn = 'DOB'
SET @SortExpression = 'DESC' -- Need to sort in both ASC and DESC
Select
Name,
DOB,
Rate,
ROW_NUMBER() OVER
(ORDER BY
CASE WHEN @SortColumn = 'Name' then Name
WHEN @SortColumn = 'DOB' THEN convert(char(10), DOB, 120)
WHEN @SortColumn = 'Rate' THEN Cast(Rate as varchar(10))
END ASC
) AS RowNumberASC,
ROW_NUMBER() OVER
(ORDER BY
CASE WHEN @SortColumn = 'Name' then Name
WHEN @SortColumn = 'DOB' THEN convert(char(10), DOB, 120)
WHEN @SortColumn = 'Rate' THEN Cast(Rate as varchar(10))
END DESC
) AS RowNumberDESC
FROM Table1
由于@Martin指出ASC
,DESC
无法参数化。
答案 1 :(得分:0)
如果您需要动态切换ASC
和DESC
,则必须使用动态声明。
SQL小提琴here。请注意SQL Injection!
EXECUTE(' SELECT Name, DOB, Rate,'
+ ' ROW_NUMBER() OVER( ORDER BY ' + @SortColumn + ' ' + @SortExpression
+ ' ) AS RowNumber'
+ ' FROM Table1');
如果您的查询很复杂,请考虑将其放入视图中并从该视图中选择以允许对该部分进行编译时检查。