2017-12-20 5 views
0

가정하자 내가 가지고있는 나의 SQL Server 테이블에서 HIERARCHYID 열 다음 : 나는 다음과 같은 INTTopNode 열을 반환하는 쿼리 작성하려는SQL 서버 - 인 HierachyId 필드에서 첫 번째 노드를 가져옵니다

MyCol 
/1/1/ 
/2/1/ 
/3/1/1/ 
/3/1/2/ 
/3/2/1/1/ 
/3/2/1/2/ 
/4/1/ 
/4/2/ 
/5/1/ 
/6/1/ 
/7/1/ 
/8/1/ 
/8/2/ 

그리고 - 기본적으로 반환 을 MyCol 컬럼의 최상위 값 :

MyCol  TopNode 
/1/1/  1 
/2/1/  2 
/3/1/1/  3 
/3/1/2/  3 
/3/2/1/1/ 3 
/3/2/1/2/ 3 
/4/1/  4 
/4/2/  4 
/5/1/  5 
/6/1/  6 
/7/1/  7 
/8/1/  8 
/8/2/  8 

가 나는 인 HierachyId 데이터 형식을 사용하는 비교적 새로운 해요 및 correc을 찾는 문제를 데 t 함수를 GetDescendant, GetLevel 등이 정수를 반환 할 수 있습니다.

가능한 가장 쉬운 방법으로 어떻게 이것을 수행 할 수 있습니까?

+0

입니까? – scsimon

답변

2

는 경우에이 일을합니까?

DECLARE @T TABLE(X HIERARCHYID) 
INSERT @T SELECT '/1/1/' 
INSERT @T SELECT '/2/1/' 
INSERT @T SELECT '/3/1/' 
INSERT @T SELECT '/3/2/' 
INSERT @T SELECT '/3/3/' 
INSERT @T SELECT '/3/4/' 

SELECT 
    X.GetAncestor(X.GetLevel()-1), 
    X.GetAncestor(X.GetLevel()-1).ToString() 
FROM @T 

당신은 대체 간단한에서 주조하여 INT를 유도 할 수있다 -는 최상위 노드의 한 자리는 항상>

TopLevel = CAST(REPLACE(X.GetAncestor(X.GetLevel()-1).ToString(),'/','') AS INT) 
+0

TopLevel에 대해 int에 캐스트를 추가했습니다. –

+0

미안하지만, 나는 완전히 당신의 대답을 오해했다 - 그것은 완벽하다 !!! * 감사합니다 * –

2

이 작동합니다 :

SELECT SUBSTRING(YourString, CHARINDEX('/', YourString) + 1, CHARINDEX('/', YourString,CHARINDEX('/', YourString)+1) - (CHARINDEX('/', YourString) + 1)) 
FROM YourTable; 
+0

정말 고마워요! - ** HOPER ** ** HIERARCHYID 필드로 직접 처리 할 수있는 방법이 있었지만 확실히 그 트릭을 할 것입니다 !! –