2011-05-04 5 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 

내가 2 쿼리를 사용하는 경우, 결과는 (내가 예상 한대로)가 true를 제공,하지만 난 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를 사용할 수있을 때 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)을 반드시 읽어야합니다! –

+0

@marc_s 좋은 링크, 고마워. 그리고 죄송합니다, 여기에 늦었고 대부분의 경우 동적 SQL을 선호하는 ORDER BY에서 CASE WHEN을 사용할 수 있다는 것을 완전히 잊었습니다. – rsbarro