2011-05-04 109 views
0

1)查询执行

declare @OrderBy varchar(100) = 'CompanyName' 
declare @SortingOrder varchar(5) = 'desc' 

Select * from [User] order by (@OrderBy + ' ' + @SortingOrder) 

2)

Select * from [User] order by CompanyName desc 

如果我使用第二查询,那么结果成真(如我所料),但如果我用1号查询,则结果是不像预期的那样。

我的意思是通过按降序排列公司名称来显示结果集。

第一个查询有什么问题? 有人请解释一下。

谢谢。

回答

1

对于查询编号1,您不能通过动态指定要执行的列来指定要执行的操作。然而,你可以建立一个SQL字符串,并使用EXEC执行:

declare @OrderBy varchar(100) = 'CompanyName' 
declare @SortingOrder varchar(5) = 'desc' 
declare @sql varchar(1000) 
SET @sql = 'Select * from [User] order by ' + @OrderBy + ' ' + @SortingOrder 
EXEC(@sql) 

或者,如果你想避免动态SQL,您可以使用CASE WHEN语句在ORDER BY:

declare @OrderBy varchar(100) = 'CompanyName' 
declare @so varchar(5) = 'desc' 

SELECT * FROM [User] 
ORDER BY 
    CASE WHEN @OrderBy = 'CompanyName' AND @so = 'desc' THEN CompanyName END DESC, 
    CASE WHEN @OrderBy = 'CompanyName' AND @so <> 'desc' THEN CompanyName END 
+2

如果你连想想使用动态SQL,你**必须阅读[动态SQL的诅咒和祝福](http://www.sommarskog.se/dynamic_sql.html)! – 2011-05-04 05:48:27

+0

@marc_s很好的链接,谢谢。而且,对不起,这里迟到了,我完全忘了你可以在ORDER BY中使用CASE WHEN,在大多数情况下,我更喜欢动态SQL。 – rsbarro 2011-05-04 06:19:00