2012-04-17 5 views
0

내가 2008정렬이

우리가 첫 번째 행에서 그런 말을하자 SQL 서버의 테이블에 정의 된 HIERARCHYID 열이의 HIERARCHYID는 '/ 7분의 1/1 /'

입니다

두 번째 행에서 hierarchyid는 '/ 1/10/1 /'입니다.

내가 sort by hierarchyid ASC 인 경우 두 번째 행이 표시되고 첫 번째 행이 표시됩니다. (정렬은 문자열별로 정렬되며 '10'< '7')

그러나 나는 (다른 시스템과의 호환성을 이유로) 첫 번째 행을 먼저보고 싶습니다. int로 정렬하고 < 10)

두 번째 hierarchyid 열을 정의한 다음 첫 번째 hierarchyid 열과 동일하게 설정하지만 모든 내부 슬래시를 점으로 바꾼 다음 문제를 해결했습니다. 이것으로 정렬하고있다.

나는 더 우아한 방법이 있는지 궁금해했습니다.

+2

[hierarchyid] (http://technet.microsoft.com/en-us/library/bb677290.aspx)를 사용하고 있습니까? 솔기가 예상대로 작동합니다. 보십시오 [여기] (http://sqlfiddle.com/#!3/d7cfe/2). –

+0

당신이 옳습니다 (그나저나 멋진 링크). 내가 뭘 잘못했는지 확인해야 할 것입니다. (hierarchyID를 사용하고 있습니다 만 다른 요인이있을 수 있습니다) – gordon613

답변

0

두 개의 "/"사이에 무엇을 분리해야합니까? 당신이 "/"세 번째의 위치를 ​​알아 사이에 무엇을 얻을 수 있습니다 3. 그래서

declare @aux_str varchar(50) 
set @aux_str='/1/7/3/' 

select dbo.fnNthIndex(@aux_str,'/',2) 

반환 문자열의 n 번째 인덱스를 얻기 위해 그들을 http://www.sqlusa.com/bestpractices2005/nthindex/

: 이 기능을 사용할 수 있습니다 그것.

하지 하드

그것의, 그러나 작업은 꽤 많은

+0

대단히 감사합니다. 이 솔루션은 hierarchyID가 항상 세 단계라고 가정합니다. 내 질문에 가능한 한 간단하게 문제를 제시하고 싶었지만 hierarchyID는 여러 수준이 될 수 있습니다. – gordon613

+0

예가 hierarchyId가 아니며 varchar 데이터 유형입니다! –

0

내가이 상당히 오래된 질문입니다 알고 있지만, 구글은 그래서 경우에 실제 답을 추가 할 거라고 생각에서 먼저 결과였다 다른 사람이 가로 질러 온다 이. 사용되는 SQL을 보지 않고는 100 %로 단단하지만 난 OP는 문자열로 계층 구조 이드 반환 오히려 계층 ID 자체에 정렬보다 그에 정렬 것으로 의심 ..

EG

declare @results table (Id int, Hierarchy hierarchyId) 

-- : 
-- Add your data here 
-- : 

-- This will not work as it's ordering a string 
select Id, Hierarchy.ToString() as SortOrder from @results order by SortOrder 

-- This will work as it's ordering the hierarchy id 
select Id, Hierarchy.ToString() as SortOrder from @results order by Hierarchy 
+0

귀하의 제안에 대해 Andy에게 감사드립니다. 제 프로덕션 코드를 부활 시키려고 했으므로 다음과 같은'select * from ..., HIERARCHY.ToString() as HIERARCHY, ROW_NUMBER() OVER (PARTITION BY) HIERARCHY에 의한 HIERARCHY 주문) AS RowNumber FROM MyTable' 그리고 당신의 대답은 'HIERARCHY에 의한 순서'가 원래의 필드가 아니라 .ToString()을 사용하고 있다고 설명 할 것입니다. – gordon613

+0

이것이 나의 원래 코드라면, 원래의 질문은 분명하지 않습니다. 그러나 오래 전부터이 질문에 대한 답을 구하지 못했습니다. 어쨌든, 비 우아한 솔루션은 오랫동안 생산되어 왔으며, 가까운 장래에 코드의이 섹션을 작성하지는 않을 것입니다. 죄송합니다. 지금 당장 자원을 얻지 못하고 답변을 채점하지 못했습니다. – gordon613